python+OpenCV图像处理(九)图像金字塔
圖像金字塔
? ? ? ?圖像金字塔是圖像多尺度表達的一種,是一種以多分辨率來解釋圖像的有效但概念簡單的結構。圖像金字塔最初用于機器視覺和圖像壓縮,一幅圖像的金字塔是一系列以金字塔形狀排列的分辨率逐步降低,且來源于同一張原始圖的圖像集合。其通過梯次向下采樣獲得,直到達到某個終止條件才停止采樣。我們將一層一層的圖像比喻成金字塔,層級越高,則圖像越小,分辨率越低。
? ? ? ? 從上面對圖像金字塔的定義來看,圖像金字塔的功能之一就是對圖像尺度尺度的轉換,即放大或者縮小圖片,在OpenCV中提供了兩種方法:
- cv2.resize()函數,這種方法可直接對圖像進行尺度的變換,在我的博客??圖像的簡單幾何變換? 中,提供了相應的示例。
- cv2.pyrUp()、cv2.pyrDown()函數。這是與圖像金字塔相關的兩個函數,分別是對圖像的向上采樣、向下采樣操作。
?圖像金字塔一般有兩種類型:
- 高斯金字塔(Gaussianpyramid):用來向下采樣,是主要的圖像金字塔。
- 拉普拉斯金字塔(Laplacianpyramid):用來從金字塔底層圖像重建上層未采樣圖像,在數字圖像處理中也就是預測殘差,可以對圖像進行最大程度的還原,配合高斯金字塔一起使用。
兩者的簡要區別:高斯金字塔用來向下采樣圖像,而拉普拉斯金字塔則用來從金字塔底層圖像中向上采樣重建一個圖像。?
在OpenCV中:
- 對圖像向上采樣:pyrUp()函數
- 對圖像向下采樣:pyrDown()函數
?
這里的向下與向上采樣是對圖像的尺度來說的?,相當于倒立的金字塔,向上就是圖像尺寸加倍,向下就是圖像尺寸減半。
需要注意的是,pyrUp和pyrDown不是互逆的,即上采樣不是下采樣的逆操作。
? ? ? ?pyrDown()是一個會丟失信息的函數。為了恢復原來更高分辨率的圖像,要獲得由于下采樣操作所丟失的信息,這些數據就和拉普拉斯金字塔有關了。
圖像的拉普拉斯金字塔可以由圖像的高斯金字塔得到,轉換的公式為:
img = cv2.imread('3.jpg', 0) img1 = cv2.pyrDown(img) # 高斯金字塔 _img1 = cv2.pyrDown(img1) _img = cv2.pyrUp(_img1) img2 = img1 - _img # 拉普拉斯金字塔 cv2.imshow('img1', img1) cv2.imshow('img2', img2) cv2.waitKey(0) cv2.destroyAllWindows()?拉普拉斯金字塔的圖像看起來就像是邊界圖。經常被用在圖像壓縮中。
? ? ? ?關于圖像的放大和縮小,個人認為還是使用resize()函數比較好,因為他不會使圖像變得特別模糊,而且非常簡便。這里再對之前的resize函數知識再做一些補充。
第六個參數,int類型的interpolation,用于指定插值方式,默認為INTER_LINEAR(線性插值)。
可選的插值方式如下:
- INTER_NEAREST - 最近鄰插值
- INTER_LINEAR - 線性插值(默認值)
- INTER_AREA - 區域插值(利用像素區域關系的重采樣插值)
- INTER_CUBIC –三次樣條插值(超過4×4像素鄰域內的雙三次插值)
- INTER_LANCZOS4 -Lanczos插值(超過8×8像素鄰域的Lanczos插值)
若要縮小圖像,一般情況下最好用CV_INTER_AREA來插值,
而若要放大圖像,一般情況下最好用CV_INTER_CUBIC(效率不高,慢,不推薦使用)或CV_INTER_LINEAR(效率較高,速度較快,推薦使用)。
修仙路上不孤單,兩位道友的博客,歡迎關注。
https://me.csdn.net/qq_41007606
https://me.csdn.net/weixin_38877564
總結
以上是生活随笔為你收集整理的python+OpenCV图像处理(九)图像金字塔的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python+OpenCV图像处理(十二
- 下一篇: matlab画图设置