(三)OpenCV图像金字塔
2020-02-28 本文已影响0人
zqyadam
高斯金字塔
高斯金字塔- 第0层:原始图像(N×N)
- 第1层:高斯滤波 -> 下采样 [N/2 , N/2]
- 第2层:高斯滤波 -> 下采样 [N/(2^1) , N/(2^1)]
- ...
- 第n层:高斯滤波 -> 下采样 [N/(2^n) , N/(2^n)]
采样可逆性
无论是先下采样,然后再上采样,还是先上采样,在下采样,都是不能讲图像还原回去的。
如果想还原图像,需要采用下面的拉普拉斯金字塔
拉普拉斯金字塔
拉普拉斯金字塔拉普拉斯金字塔中的第i层,等于“高斯金字塔中的第i层”与“高斯金字塔中的第i+1层的向上采样结果”之差。
- Li:表示拉普拉斯金字塔的第i层
- Gi:表示高斯金字塔的第i层
- Gi+1:表示高斯金字塔的第i+1层,即:
import cv2
def gaussin_yyramid(img, num_layers=3):
G = [img]
for i in range(num_layers):
G.append(cv2.pyrDown(G[i]))
return G
def laplace_pryramid(G):
L = []
for i in range(len(G) - 1):
L.append(G[i] - cv2.pyrUp(G[i + 1]))
return L
def reconstuct_image(G, L, layer):
if layer > (len(L) - 1):
assert "无法重建图像"
return
Li = L[layer]
Gi = G[layer + 1]
image = Li + cv2.pyrUp(Gi)
return image
def main():
img = cv2.imread("lena.tif")
# 获取高斯金字塔
G = gaussin_yyramid(img, 3)
# 解构高斯金字塔每一层,第一个G0就是原图像img
G0, G1, G2, G3 = G
# 获取拉普拉斯金字塔
L = laplace_pryramid(G)
R1 = reconstuct_image(G, L, 1)
# 显示原图像
cv2.imshow('Original', img)
# ============= 重建G1图像 =============
# 显示G1图像
cv2.imshow('G1', G1)
# 显示重建后的图像
cv2.imshow('r1', R1)
# 显示两个图像的插值,全黑表示没有差别
cv2.imshow('diff', G1 - R1)
cv2.waitKey(0)
cv2.destroyAllWindows()
if __name__ == "__main__":
main()