圖像金字塔是對圖像進行多分辨率表示的一種有效且簡單的結構。
一個圖像金字塔是一系列以金字塔形狀排列的分辨率逐步降低的圖像。圖像金字塔的底部是待處理圖像的高分辨率表示,而頂部是低分辨率表示。
圖像金字塔有什么作用?
圖像金字塔常用于圖像縮放、圖像重構、圖像融合、圖像增強技術中。
這里說下圖像金字塔在圖像融合技術中的應用:多分辨率塔式圖像融合算法是現(xiàn)在較為常用的圖像融合方法。在這類算法中,原圖像被層層濾波和縮小,形成一個塔狀結構。在塔的每一層都用一種融合算法對這一層的數(shù)據(jù)進行融合,從而得到一個經(jīng)算法處理后的塔式結構,然后對處理后的塔式結構進行重構,從而得到合成圖像。
另外,圖像金字塔可以將原圖像分別分解到不同的空間頻帶上,這樣就可以針對不同分解層的不同頻帶上的特征與細節(jié),采用不同的算子以達到更有針對性的算法優(yōu)化處理。
高斯金字塔和拉普拉斯金字塔是最常見的兩種圖像金字塔。
下面詳細介紹高斯金字塔和拉普拉斯金字塔。
高斯金字塔
高斯金字塔是指通過高斯模糊濾波和下采樣不斷地將圖像的尺寸縮小,進而在金字塔中包含多個分辨率的一組圖像。高斯金字塔的形式如下圖所示:
一般情況下,高斯金字塔的最底層為原圖像,每向上一層就會通過高斯模糊濾波+下采樣縮小一次圖像的尺寸。
通常情況下,圖像的長與寬會縮小為原來的一半,由于每次圖像的長與寬都縮小為原來的一半,圖像的縮小速度非???,因此常見的高斯金字塔的層數(shù)為3~6。
在OpenCV中提供了函數(shù)pyrDown(),用于生成圖像的上一層高斯金字塔。
函數(shù)pyrDown()的原型如下:
void cv::pyrDown(InputArray src,
OutputArray dst,
const Size & dstsize = Size(),
int borderType = BORDER_DEFAULT )
函數(shù)pyrDown()的參數(shù)意義如下:
src—輸入圖像
dst—輸出圖像,它的寬度和高度大致為src的1/2 ,具體精確的大小由第三個參數(shù)dstsize決定。
dstsize—目標圖像的大小,默認值為Size((src.cols+1)/2, (src.rows+1)/2),自己指定時需要滿足以下條件。
bordertype—做高斯濾波時的邊界擴展標志。關于邊界擴展的詳細介紹可參見下面這篇博文:
https://www.hhai.cc/thread-178-1-1.html
使用函數(shù)pyrDown()生成上一層高斯金字塔包含兩個過程,即高斯核卷積(用于實現(xiàn)高斯模糊濾波)和下采樣兩個過程。
設
G
n
G_{n}
Gn?表示第n層高斯金字塔的圖像,則
G
0
G_{0}
G0?表示高斯金字塔的最底層,這一層實際上就是原圖像。為了得到
G
n
+
1
G_{n+1}
Gn+1?,首先需要對
G
n
G_{n}
Gn?進行高斯核卷積,即做高斯低通濾波,然后刪除所有的偶數(shù)行和偶數(shù)列(這是一種下采樣操作),從而得到
G
n
+
1
G_{n+1}
Gn+1?。
函數(shù)pyrDown()使用的高斯核如下:
提問:為什么高斯金字塔在下采樣操作之前要先進行高斯低通濾波。
答:這樣做既能保證高斯金字塔低通處理的性質,又能對圖像進行平滑,使下采樣得到的圖像不至于出現(xiàn)邊界縫隙。
總結一下:圖像高斯金字塔的上一層是對下一層進行低通濾波后再進行隔行隔列采樣得到的。上一層圖像的大小約為下一層圖像的1/4。
拉普拉斯金字塔
拉普拉斯金字塔實際上是為了實現(xiàn)高斯金字塔的圖像重建而存在的。它是在高斯金字塔的基礎上生成的。拉普拉斯金字塔是高斯金字塔與其上一層通過上采樣擴大后的差值圖像,這里的上采樣一般采用插值的方式進行。
昊虹君在網(wǎng)上找到了一幅示意圖,很形象具體地解釋了拉普拉斯金字塔是怎么回事,
這幅示意圖請大家訪問本博文的原文查看,
本博文的原文鏈接:
https://www.hhai.cc/thread-198-1-1.html
從上面昊虹君找到的那幅示意圖我們可以清晰地看出:第n層拉普拉斯圖像實際上是第n層高斯圖像與第n+1層高斯圖像經(jīng)上采樣后的差值,由于高斯濾波器是一種低通濾波器,所以我們可以說某一級的拉普拉斯金字塔可以反映出其同級的高斯金字塔的高頻分量。有些文獻把拉普拉斯金字塔反映其同級高斯金字塔的高頻分量的性質稱為拉普拉斯金字塔的預測殘差作用。
從上面拉普拉斯圖像的生成過程我們可以看出,在利用高斯金字塔生成拉普拉斯金字塔的過程中,假設高斯金字塔為N層,則在計算第N層的拉普拉斯金字塔時我們還要額外計算出第N+1層的高斯金字塔才能進而計算出第N層的拉普拉斯金字塔。
OpenCV提供了函數(shù)pyrUp()用于幫助計算出拉普拉斯金字塔。通過它可以把第n層的高斯金字塔圖像進行上采樣后再進行高斯卷積模糊濾波操作。
OpenCV官方文檔中對其功能的描述如下:
“The function performs the upsampling step of the Gaussian pyramid construction, though it can actually be used to construct the Laplacian pyramid. First, it upsamples the source image by injecting even zero rows and columns and then convolves the result with the same kernel as in pyrDown multiplied by 4”
從上面的描述中我們可知,函數(shù)pyrUp()的上采樣操作是均勻地隔行隔列加0值。上采樣完成之后用下面這個卷積核進行高斯卷積模糊濾波操作。
請注意:上面這個卷積核與函數(shù)pyrDown()的卷積核有所不同,具體是函數(shù)pyrDown()高斯卷積核需要乘以四才得到函數(shù)pyrUp()的卷積核,至于為什么要這樣做,博主昊虹君目前沒有搞清楚,猜想應該是與其上采樣時隔行隔列插0值有關。知道原因的朋友可以與昊虹君說一說,先謝謝了。
函數(shù)pyrDown()的的原型如下:
void cv::pyrUp(InputArray src,
OutputArray dst,
const Size & dstsize = Size(),
int borderType = BORDER_DEFAULT )
各參數(shù)的意義和函數(shù)pyrDown()的一樣,這里就不再贅述了。
這里要特別注意:函數(shù)pyrDown()的dst參數(shù)中得到的并不是拉普拉斯金字塔圖像。
如果要得到拉普拉斯金字塔圖像,還需要按下面的公式進行運算。
令
L
n
L_{n}
Ln?表示第n層拉普拉斯金字塔,
G
n
G_{n}
Gn?表示第n層高斯金字塔,則有:
L n = G n ? P y r u p ( G n + 1 ) L_{n}=G_{n}-Pyrup(G_{n+1}) Ln?=Gn??Pyrup(Gn+1?)
顯然我們可以利用下面的公式重構第n層高斯金字塔圖像:
G
n
′
=
L
n
+
P
y
r
u
p
(
G
n
+
1
)
G_{n}^{'} =L_{n}+Pyrup(G_{n+1})
Gn′?=Ln?+Pyrup(Gn+1?)
接下來上基于Python-OpenCV的示例代碼,
該示例代碼是對函數(shù)pyrDown()和pyrUp()的綜合使用,
該示例代碼先對圖像進行高斯金字塔下采樣處理,
再利用某一層的拉普拉普金字塔和高斯金字塔還原上一層圖像。
代碼寫了詳細的注釋,大家應該能夠很容易理解。
具體的代碼請大家訪問本博文的原文獲取,
本博文的原文鏈接:
https://www.hhai.cc/thread-198-1-1.html文章來源:http://www.zghlxwxcb.cn/news/detail-440524.html
代碼運行結果如下圖所示:
從上面的結果中我們可以看出,利用某一層的高斯金字塔和拉普拉斯金字塔重構出的圖像與原圖相比在細節(jié)上(高頻分量上)并沒有多少缺失。文章來源地址http://www.zghlxwxcb.cn/news/detail-440524.html
到了這里,關于圖像金字塔、高斯金字塔、拉普拉斯金字塔是怎么回事?附利用拉普拉斯金字塔和高斯金字塔重構原圖的Python-OpenCV代碼的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!