目錄
- 圖像金字塔介紹
- 圖像金字塔的分類
(1)高斯金字塔
(2)拉普拉斯金字塔 - OpenCV方法介紹及代碼實現
(1)pyrDown 下采樣
(2)pyrUp 下采樣
圖像金字塔介紹
圖像金字塔是圖像中多尺度表達的一種,最主要用於圖像分割,也就是用來圖像縮放的。
進行圖像縮放可以用圖像金字塔,也可以用cv.resize函數進行縮放,後果效果更好,且更加靈活
圖像金字塔分類
-
高斯金字塔(Gaussianpyramid):用來下采樣,最基本的金字塔
上圖,將leve0爲原圖G0,按照level等級依次爲G1,G2,G3,G4
圖像下采樣
爲了獲取層級爲 G1 的金字塔圖像,我們採用如下方法:
<1> 對原圖像進行高斯內核卷積
<2> 將所有偶數行和列去除
得到上一層圖像G1,結果圖像只有原圖的四分之一。通過對輸入圖像不停迭代以上步驟就會得到整個金字塔。同時我們也可以看到,向下取樣會逐漸丟失圖像的信息。
以上就是對圖像的向下取樣操作,即縮小圖像。。圖像上採樣
-
拉普拉斯金字塔(Laplacianpyramid):用於重建圖像,配合高斯金字塔一起使用,也就是預測殘差,對圖像進行最大程度的還原。比如一幅小圖像重建爲一幅大圖
如果想放大圖像,具體做法如下:
<1>將圖像G4在每個方向擴大爲原來的兩倍,新增的行和列以0填充
<2>使用先前同樣的內核(乘以4)與放大後的圖像卷積,獲得 “新增像素”的近似值
<3>再用G3減去第二步得到的圖像pyrUP(G4)即的到放大的圖像
得到的圖像即爲放大後的圖像,但是與原來的圖像相比會發覺比較模糊,因爲在縮放的過程中已經丟失了一些信息,如果想在縮小和放大整個過程中減少信息的丟失,這些數據形成了拉普拉斯金字塔。
OpenCV方法介紹及代碼實現
OpenCV方法介紹及代碼實現
高斯金字塔實現下采樣pyrDown
import cv2 as cv
import numpy as np
def pyramid_demo(image):
level = 3
temp = image.copy()
for i in range(level):
pyrdowm_imgs = []
dst = cv.pyrDown(temp) #對圖像進行下采樣,圖像變成原來的四分之一
pyrdowm_imgs.append(dst) # 將每次縮小的圖片儲存到列表內
temp = dst.copy()
cv.imshow("level"+str(i+1), dst) #展示圖片
return pyrdowm_imgs
print("----------------hello python opencv---------------------")
src = cv.imread("D:/pyhton/PhotoIditifyStuday/photo/girl.jpg") #讀取原圖片
cv.namedWindow("input_image", cv.WINDOW_AUTOSIZE)
cv.imshow("input_image", src)
pyramid_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()
使用拉普拉斯金字塔實現上採樣 pyrUp
import cv2 as cv
import numpy as np
def pyramid_demo(image):
level = 3
temp = image.copy()
pyrdowm_imgs = []
for i in range(level):
dst = cv.pyrDown(temp) #對圖像進行下采樣,圖像變成原來的四分之一
pyrdowm_imgs.append(dst) # 將每次縮小的圖片儲存到列表內
temp = dst.copy()
cv.imshow("level"+str(i+1), dst) #展示圖片
return pyrdowm_imgs
def lapalian_demo(image):
pyrdown_imgs = pyramid_demo(image) #拉普拉斯需要使用高斯金字塔的結果
levels = len(pyrdown_imgs)
for i in range(levels-1, -1, -1):
if i == 0:
expand = cv.pyrUp(pyrdown_imgs[i], dstsize=image.shape[:2]) #這裏的size必須和下一步相減的尺寸相同
lpls = cv.subtract(image, expand)
cv.imshow("lpls"+str(i), lpls)
else:
expand = cv.pyrUp(pyrdown_imgs[i], dstsize=pyrdown_imgs[i-1].shape[:2])
lpls = cv.subtract(pyrdown_imgs[i-1], expand)
cv.imshow("lpls" + str(i), lpls)
print("----------------hello python opencv---------------------")
src = cv.imread("D:/pyhton/PhotoIditifyStuday/photo/girl.jpg") #讀取原圖片
cv.namedWindow("input_image", cv.WINDOW_AUTOSIZE)
cv.imshow("input_image", src)
lapalian_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()