opencv图像金字塔的介绍
生活随笔
收集整理的這篇文章主要介紹了
opencv图像金字塔的介绍
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.學習目標:
- 掌握opencv圖像金字塔的原理
學習內容:
1.什么是圖像金字塔?
2.圖像金字塔有什么用?
3.圖像金字塔實現方式
學習產出:
1. 什么是圖像金字塔? 圖像金字塔(如圖 1 所示)是一種以多分辨率來解釋圖像的結構,通過對原始圖像進行多尺度 像素采樣的方式,生成 N 個不同分辨率的圖像。把具有最高級別分辨率的圖像放在底部,以金字 塔形狀排列,往上是一系列像素(尺寸)逐漸降低的圖像,一直到金字塔的頂部只包含一個像素點 的圖像,這就構成了傳統意義上的圖像金字塔。圖像金字塔底部是待處理的高分辨率圖像,也就是 原始圖像,頂部是低分辨率的近似圖像。一般情況下,都是每向上移動一級,圖像的寬和高都降低 為原來的 1/2 。金字塔高層圖片通過向上采樣得到底層圖片,底層圖片通過向下取樣得到高層圖 片。 圖 1 圖像金字塔 2. 圖像金字塔有什么用? (1) 圖像金字塔能夠幫助提取更多“有用”的特征,在進行圖像處理時能夠幫助節省計算資源。特 別地,在目標檢測的場景中,由于不同攝像頭分辨率、設置位置不同,場景光線敏感程度都有 差別,圖像中的物體通常很可能是遠近不一,大小不一,由于圖像金字塔底層關注圖像細節, 而高層注重圖像輪廓,此時就可以利用金字塔來檢測不同尺度下的物體。這種方法要比使用不 同大小的 sliding window 在原圖上做檢測節省太多的算力,大大實驗增強效果,避免了大量 噪聲圖片的輸入造成計算資源的浪費。 (2) 圖像金字塔有助于避免模型過擬合。在某些圖像處理的算法中,圖像金字塔的多分辨率運算可 以避免陷入局部點或者過擬合狀態,增強模型魯棒性。 (3) 圖像金字塔可用于圖像融合。圖像拉普拉斯金字塔將源圖像分別分解到不同的空間頻帶上,而 圖像融合過程就是在各空間頻率層上分別進行的,這樣就可以針對不同分解層的不同頻帶上的 特征與細節,采用不同的融合算子以達到突出特定頻帶上特征與細節的目的。即有可能將來自 不同圖像的特征與細節融合在一起。 (4) 圖像縮放等等。 3. 圖像金字塔實現方式 1——resize 函數 resize 函數主要實現的功能是將圖片縮放到目標大小。resize 函數的主要特點是,它不會使圖 像變得模糊。函數的構成: resize(InputArray src, OutputArray dst, Size dsize, double fx = 0, double fy = 0, int interpolation = INTER_LINEAR)其中 src 代表原圖像,dst 代表輸出圖像,const Size & dstsize 設置輸出圖像的大小,fx,fy 設定 x 和 y 方向上的縮放比例,interpolation 指定了默認插值方式為雙線性插值,雙線性插值的 數學原理如下。 例:resize(img, dst, Size(),0.5,0.5);將原圖 img 長寬都變為原來的 0.5 倍,得到輸出圖像 dst 的分辨率變為原來的 1/4,重復以上操作我們就可以得到通過下采樣得到的多層金字塔圖片。 4. 圖像金字塔實現方式 2——高斯金字塔(Gaussianpyramid) 高斯金字塔是指通過高斯模糊濾波和下采樣不斷地將圖像的尺寸縮小,進而在金字塔中包含多 個分辨率的一組圖像。高斯金字塔的形式如下圖所示:?
一般情況下,高斯金字塔的最底層為原圖像,每向上一層就會通過高斯模糊濾波+下采樣縮小 一次圖像的尺寸。通常情況下,圖像的長與寬會縮小為原來的一半,由于每次圖像的長與寬都縮小 為原來的一半,圖像的縮小速度非常快,因此常見的高斯金字塔的層數為 3~6。以圖為例,對應分 辨率 512*512 的原圖 O 首先做高斯變換得到相同尺寸的濾波圖像,然后將濾波圖像進行下采樣就得到了第一次采樣圖片 D1,此時圖片的分辨率變為 256*256,重復以上的操作就能得到多次采樣 后的高斯金字塔。 設 Gn 表示第 n 層高斯金字塔的圖像,則 G0 表示高斯金字塔的最底層(即原圖像)。為了得 到 G n+1,首先需要對 Gn 進行高斯核卷積,即做高斯低通濾波,然后刪除所有的偶數行和偶數列, 從而得到 Gn+1。這個函數使用的高斯核如下: 高斯濾波其實是一種線性平滑濾波,適用于消除高斯噪聲,廣泛應用于圖像處理的減噪過程。 簡單來說就是整個圖像某個像素點的值與周圍像素點的值掛鉤,原圖像某一像素點的值其實是其本 身和周圍像素點值的加權平均過程。之所以要先進行高斯濾波,是為了在下采樣刪除偶數行和列的 時候能盡量減少信息的丟失。 高斯金字塔實現的函數:pyrDown,函數構成: pyrDown(InputArray src, OutputArray dst, const Size & dstsize = Size(), int borderType =BORDER_DEFAULT) 參數解析: InputArray src:源圖像,Mat 類的對象 OutputArray dst:輸出圖像 const Size & dstsize:輸出圖像的大小 borderType:邊界處理方式,處理的方法參照官網的說明為:“gfedcb | abcdefgh| gfedcba”。之所以會有邊界處理方式,是因為在進行高斯濾波圖像做卷積時,處于邊界的像 素點在被選定為中心點時不能直接卷積,需要在原圖邊界添加像素點作為補充。 另一方面,我們可以通過上采樣的方法實現高斯金字塔,上采樣的過程包括:(1)將圖像 在每個方向放大為原來的兩倍,新增的行和列用 0 填充;(2)使用向下采樣時所使用的的高 斯濾波器對補零后的圖像進行濾波處理,以獲取向上采樣的結果圖像;(3)如上步驟,下采 樣后圖片擴大為原圖的 4 倍,重復上訴步驟得到高斯金字塔。實現函數為:pyrUp 函數,函數 構成為:pyrUp( InputArray src, OutputArray dst,const Size& dstsize = Size(), int borderType = BORDER_DEFAULT ),參數的釋義參照 pyrDown 函數。但值得注意的是在 進行步驟(2)時所用的高斯核為下采樣金字塔所用高斯核的 1/4,因為 RGB 圖像像素值的范 圍是[0, 255],由于其中添 0 后圖像中四分之三的像素點的值都是為零,如果直接使用高斯濾 波器對其進行卷積計算,會導致像素值的范圍變為[0, 255*1/4]。所以,要將所使用的高斯濾 波器系數乘以 4,以保證得到像素值的范圍仍舊在[0, 255]內。 5. 圖像金字塔實現方式 3——拉普拉斯金字塔(Laplacianpyramid) 拉普拉斯金字塔: 用來從金字塔低層圖像重建上層未采樣圖像,在數字圖像處理中也即是預測 殘差,可以對圖像進行最大程度的還原,配合高斯金字塔一起使用。首先對高斯金字塔原始圖像 Gi 進行向下取樣,然后向上采用,最后與原始圖像相減,就得到了拉普拉斯金字塔圖像。 要從高斯金字塔第 i 層生成第 i+1 層(即 G_i+1),首先要用高斯核對 G_1 進行卷積,然后刪除 所有偶數行和偶數列,新得到圖像面積會變為源圖像的四分之一。按上述過程對輸入圖像 G_0 執 行操作就可產生出整個高斯金字塔。圖像金字塔中的向上和向下采樣分別通過 OpenCV 函數pyrUp 和 pyrDown 實現。因為用 pyrDown 做下采樣操作的時候會有像素信息損失,做高斯模 糊時會濾掉高頻像素點。拉普拉斯圖像可以幫助提取出圖像的高分辨率的像素點和下采樣丟掉的點。 假設我們已經有一個高斯圖像金字塔,對于其中的第 i 層圖像(高斯金字塔最下面為第 0 層), 首先通過下采樣得到一尺寸縮小一半的圖像,即高斯金字塔中的第 i+1 層或者不在高斯金字塔中, 之后對這張圖像再進行上采樣,將圖像尺寸恢復到第 i 層圖像的大小,最后求取高斯金字塔第 i 層 圖像與經過上采樣后得到的圖像的差值圖像,這個差值圖像就是拉普拉斯金字塔的第 i 層圖像,整 個過程的流程如圖所示。計算公式 :Li = Gi -PyrUp( PyrDown(Gi) )。?
上圖中第一列圖片為高斯下采樣得到的高斯金字塔圖片;第二列圖片為高斯金字塔第 Gi 層圖 片與高斯金字塔第 Gi+1 層圖片上采樣之后兩者作差得到的拉普拉斯金字塔 Li;第三列圖片為通過 拉普拉斯金字塔恢復出來的圖片。 參考文章: OpenCV官方文檔_w3cschool opencv學習筆記(十一):圖像金字塔 - 知乎總結
以上是生活随笔為你收集整理的opencv图像金字塔的介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 常见的Java内存溢出情况和实例
- 下一篇: es6,js 数组截取并保留原数组