OpenCV笔记整理高斯金字塔&拉普拉斯金字塔
Posted 武尚发的博客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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')
运行结果:
拜了个拜。。。
以上是关于OpenCV笔记整理高斯金字塔&拉普拉斯金字塔的主要内容,如果未能解决你的问题,请参考以下文章
图像金字塔高斯金字塔拉普拉斯金字塔是怎么回事?附利用拉普拉斯金字塔和高斯金字塔重构原图的Python-OpenCV代码
OpenCV入门教程之十三OpenCV图像金字塔:高斯金字塔拉普拉斯金字塔与图片尺寸缩放
youcans 的 OpenCV 例程200篇188.基于拉普拉斯金字塔的图像融合