图象金字塔是我们创建一组图象,这些图象是具有不同分辨率的原始图像,如果把分辨率最大的放在底部,最小的放在上面,看起来就像一个金字塔,这也是他名字的由来。一般来说具体的应用是,不同的设备显示图像需要不同的分辨率,建立一个金字塔可以快速适应不同的设备;还用一个应用是图形分割方面的(基于区域)。
有两类金字塔:高斯金字塔和拉普拉斯金字塔。
高斯金字塔
高斯金字塔的顶部是通过将底部图像中的连续 的行和列去除得到的。顶部图像的每个像素值等于下一层图像中5个像素的高斯加权平均值。这样下一层比上一层,图像的行和列分别变为原来的1/2。这里边主要用到两个函数cv2.pyrDown()和cv2.pyrUp()
cv2.pyrUp(src, dst=None, dstsize=None, borderType=None)
src是出入图形,det是输出,dstsize是图象大小,borderType是边界情况。这个函数是向下构建金字塔图象会变大,但是分辨率会减小。
cv2.pyrDown(src, dst=None, dstsize=None, borderType=None)
参数和上面的类似。注意这里的函数都是基于高斯金字塔的,图像的变化情况也是如此。
import cv2
import numpy as np
import matplotlib.pyplot as plt
img=cv2.imread('C:/Users/dell/Desktop/cos.jpg')
lower=cv2.pyrDown(img)
lower=cv2.pyrDown(lower)
upper=cv2.pyrUp(img)
upper=cv2.pyrUp(upper)
plt.subplot(1,3,1),plt.imshow(img)
plt.title('original'),plt.xticks([]),plt.yticks([])
plt.subplot(1,3,2),plt.imshow(lower)
plt.title('lower'),plt.xticks([]),plt.yticks([])
plt.subplot(1,3,3),plt.imshow(upper)
plt.title('upper'),plt.xticks([]),plt.yticks([])
plt.show()
这里的放缩分别进行了两次,至于upper如果在matplotlib看的话,他的图象尺寸契税是变大了的,但是,show出来的效果就这么大,所以显示的和原始图像就一样了。
拉普拉斯金字塔
在高斯金字塔的运算过程中,图像经过卷积和下采样操作会丢失部分高频细节信息。为描述这些高频信息,人们定义了拉普拉斯金字塔。用高斯金字塔的每一层图像减去其上一层图像上采样并高斯卷积之后的预测图像,得到一系列的差值图像即为 拉普拉斯分解图像。
L i = G i − PyrUp(G i+1 )
上面的就是它的原理(csdn的公式编译出问题了吧)。这个没有专门的函数,要我们自己写的,例子我就不展示了。