OpenCV笔记整理【高斯金字塔&拉普拉斯金字塔】

图像金字塔

是同一图像不同分辨率的子图集合,通过对原图的不断向下采样而产生,由高分辨率的图像产生低分辨率的近似图像。

1. 高斯金字塔:不可逆采样

向下采样

import cv2

o=cv2.imread("lena.bmp",cv2.IMREAD_GRAYSCALE)

r1=cv2.pyrDown(o) # 对原图第一次向下采样
r2=cv2.pyrDown(r1) # 对第一次采样的图像再次向下采样
r3=cv2.pyrDown(r2) # 对第二次采样的图像再次向下采样
print("o.shape=",o.shape)
print("r1.shape=",r1.shape) # 打印采样后的图像分辨率
print("r2.shape=",r2.shape)
print("r3.shape=",r3.shape)
cv2.imshow("original",o)
cv2.imshow("r1",r1)
cv2.imshow("r2",r2)
cv2.imshow("r3",r3)

cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述
在这里插入图片描述

向上采样

import cv2

o=cv2.imread("lenas.bmp")

r1=cv2.pyrUp(o) # 向上采样
r2=cv2.pyrUp(r1) 
r3=cv2.pyrUp(r2)
print("o.shape=",o.shape)
print("r1.shape=",r1.shape)
print("r2.shape=",r2.shape)
print("r3.shape=",r3.shape)
cv2.imshow("original",o)
cv2.imshow("r1",r1)
cv2.imshow("r2",r2)
cv2.imshow("r3",r3)

cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述
在这里插入图片描述
为什么说高斯金字塔采样是不可逆的?
这里使用原始图像减去先向下采样后向上采样的图像,看看结果,理论上来说,两张图像相减结果为0(就是一片漆黑),就说明这两张图像是一张图。

import cv2

o=cv2.imread("lena.bmp")

down=cv2.pyrDown(o) # 先向下采样
up=cv2.pyrUp(down) # 再向上采样
diff=up-o   #构造diff图像,查看up与o的差异

cv2.imshow("original",o)
cv2.imshow("up",up)
cv2.imshow("difference",diff)

cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述
上面相减后的结果并非是0,也就证实了通过高斯金字塔向下采样并不是向上采样的逆运算,因为通过高斯滤波后,进行了抛弃偶数行列操作,不了避免的丢失了像素信息。


2. 拉普拉斯金字塔:可逆行采样

为了解决上述丢失像素细节的问题,这里使用另外一种采样方式----拉普拉斯金字塔。

定义形式:Li = Gi - pyrUp(Gi + 1)
简单理解就是: 先对当前一层的高斯金字塔图像,向下采样,然后向上采样,最后使用当前图像减去两次采样后的图像

  • Li:表示拉普拉斯金字塔中的第i层。
  • Gi:表示高斯金字塔中的第i层。
import cv2
import numpy as np
import matplotlib.pyplot as plt

O=cv2.imread("lena.bmp")

# 高斯金字塔并向下采样
G0=O
Gd=cv2.pyrDown(G0)

# 高斯金字塔并向上采样
Gu=cv2.pyrUp(Gd)

# 得到拉普拉斯金字塔
L0=G0-Gu 

# 通过拉普拉斯图像复原
RG0=L0+Gu


print("G0.shape=",G0.shape)
print("RG0.shape=",RG0.shape)
result=RG0-G0  #将RG0和G0做减法

#计算result的绝对值,避免求和时负负为正(PS:3+(-3)=0)
result=abs(result)  

#计算result所有元素的和
print("原始图像G0与恢复图像RG0差值的绝对值和:",np.sum(result))  


# 使用pyplot显示图像
plt.figure(figsize=(10,10),dpi=100)
plt.subplot(1,3,1)
plt.title('G0')
plt.imshow(G0),plt.axis('off')

plt.subplot(1,3,2)
plt.title('L0')
plt.imshow(L0),plt.axis('off')

plt.subplot(1,3,3)
plt.title('RG0')
plt.imshow(RG0),plt.axis('off')

运行结果:
在这里插入图片描述
拜了个拜。。。

猜你喜欢

转载自blog.csdn.net/qq_34699535/article/details/120460565