OpenCV:圖像金字塔

圖像金字塔是一種經典的圖像多尺寸描述方法,它將降採樣和平滑濾波結合在一起,對圖像進行多尺度表示。圖像金字塔由不同尺寸的圖像疊加而成,通常每一層的尺寸都是上一層的一半。通常用於高效的圖像分析,這種處理技術的意義在於:我們在對圖像進行處理時,大多是要著眼於圖像中有意義的部分,而同一幅圖像中可能含有不同尺度下“有意義”的信息,為了充分利用這些圖像信息,就需要對圖像進行多尺度描述了。

函數1:

pyrDown()

函數原型:

void pyrDown(InputArray src,OutputArray dst,const Size& dstsize=Size());

函數作用:

先對圖像進行高斯平滑,然後再進行降採樣(將圖像尺寸行和列方向縮減一半);

函數說明:

需要說明一下的是第三個參數const Size& dstsize=Size(),這個參數指的是降採樣之後的目標圖像的大小,我們可以看出它是有默認值的,如果我們調用函數的時候不指定第三個參數,那麼這個值是按照 Size((src.cols+1)/2, (src.rows+1)/2) 計算的。而且不管你自己如何指定這個參數,一定必須保證滿足以下關係式:

|dstsize.width * 2 - src.cols| ≤ 2;

|dstsize.height * 2 - src.rows| ≤ 2;

也就是說降採樣的意思其實是把圖像的尺寸縮減一半,行和列同時縮減一半。所以你指定的大小,無非就是多一行少一列的區別而已。在大多數情況下使用默認值就可了,因為這個函數不是縮減圖像至任意尺寸,就只是縮減一半,所以沒必要搞得那麼複雜。

這個縮減的過程是這樣的,隔行隔列刪去圖像中的對應行和列!由此我們也可以看出,這樣縮減會帶來的影響就是:原圖中那些精細的細節邊緣等地方,會因此變得鋸齒狀,產生失真,因此為了縮小之後圖像看起來自然,必須進行平滑,這也就是這個算法為什麼在降採樣之前先對圖像進行了高斯模糊的原因。高斯平滑採用的是下面的計算kernel:


OpenCV:圖像金字塔


函數2:

pyrUp()函數

函數原型:

void pyrUp(InputArray src, OutputArray dst, const Size& dstsize=Size());

函數作用:

先對圖像進行升採樣(將圖像尺寸行和列方向增大一倍),然後再進行高斯平滑;

函數說明:

同樣是最後一個參數,在默認的情況下,這個尺寸大小是按照 Size(src.cols*2, (src.rows*2) 來計算的。如果你自己要指定大小,那麼一定要滿足下面的條件:

|dstsize.width - src.cols * 2| ≤ (dstsize.width mod 2); //如果width是偶數,那麼必須dstsize.width是src.cols的2倍;

|dstsize.height - src.rows * 2| ≤ (dstsize.height mod 2);

然後這個函數運行的過程就是先將圖像的尺寸行和列方向都放大一倍,然後進行高斯平滑,不過此時高斯平滑的kernel是上面pyrDown()中的kernel乘上4,而不是完全相同。( 其實也很容易理解,行和列方向各放大一倍的結果就是圖像的面積放大四倍,所以這裡給之前的kernel乘以4)。


分享到:


相關文章: