图像金字塔
通常,我们过去使用的是恒定大小的图像。但是在某些情况下,我们需要使用不同分辨率的(相同)图像。例如,当在图像中搜索某些东西(例如人脸)时,我们不确定对象将以多大的尺寸显示在图像中。在这种情况下,我们将需要创建一组具有不同分辨率的相同图像,并在所有图像中搜索对象。这些具有不同分辨率的图像集称为“图像金字塔”(因为当它们堆叠在底部时,最高分辨率的图像位于顶部,最低分辨率的图像位于顶部时,看起来像金字塔)。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/2020011415354562.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM2NzU4OTE0,size_16,color_FFFFFF,t_70)
高斯金字塔:向下采样(缩小)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200114153553856.png)
高斯金字塔:向上采样(放大)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200114153554385.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM2NzU4OTE0,size_16,color_FFFFFF,t_70)
拉普拉斯金字塔
用来从金字塔低层图像重建上层未采样图像,在数字图像处理中也即是预测残差,可以对图像进行最大程度的还原从而重建高斯金字塔。 PryDown( )是一个会丢失信息的函数,所以不能通过先降采样再升采样来获得原始图像,那么,先降再升后的图片与原始图片之间的差就是降采样操作丢失的信息。为了恢复原来更高的分辨率的图像,引入拉普拉斯金字塔。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200114153609565.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM2NzU4OTE0,size_16,color_FFFFFF,t_70)
举例–图像融合
要求
将苹果的左半边与橙子的右半边融合,得到新的“品种”。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200117194220154.png) ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200117194237701.png)
代码
1、首先,将苹果和橙子的图片读入,并且,由于要做6层下采样,故调整它们的尺寸使长和宽都为64的整数倍(否则采样时将出现小数)。
img1 = cv.imread('Apple.png', 3)
A = cv.resize(img1, (448, 448), interpolation=cv.INTER_CUBIC) # 因为要做6层,所以图像尺寸的大小必须是64的整数倍
img2 = cv.imread('Orange.png', 3)
B = cv.resize(img2, (448, 448), interpolation=cv.INTER_CUBIC)
print(A.shape)
print(B.shape)
2、生成苹果图像的高斯金字塔。
G = A.copy()
gpA = [G]
plt.subplot(231), plt.imshow(cv.cvtColor(gpA[0], cv.COLOR_BGR2RGB))
for i in range(5):
G = cv.pyrDown(G)
gpA.append(G)
plt.subplot(2, 3, i+2), plt.imshow(cv.cvtColor(gpA[i+1], cv.COLOR_BGR2RGB))
plt.show()
得到结果: 3、生成橙子图像的高斯金字塔。
G = B.copy()
gpB = [G]
plt.subplot(231), plt.imshow(cv.cvtColor(gpB[0], cv.COLOR_BGR2RGB))
for i in range(5):
G = cv.pyrDown(G)
gpB.append(G)
plt.subplot(2, 3, i+2), plt.imshow(cv.cvtColor(gpB[i+1], cv.COLOR_BGR2RGB))
plt.show()
得到结果: 4、生成苹果图像的拉普拉斯金字塔。
lpA = [gpA[5]]
plt.subplot(231), plt.imshow(cv.cvtColor(lpA[0], cv.COLOR_BGR2RGB))
for i in range(5, 0, -1):
GE = cv.pyrUp(gpA[i])
L = cv.subtract(gpA[i-1], GE)
lpA.append(L)
plt.subplot(2, 3, 6-i+1), plt.imshow(cv.cvtColor(L, cv.COLOR_BGR2RGB))
plt.show()
得到结果: 5、生成橙子图像的拉普拉斯金字塔。
lpB = [gpB[5]]
plt.subplot(231), plt.imshow(cv.cvtColor(lpB[0], cv.COLOR_BGR2RGB))
for i in range(5, 0, -1):
GE = cv.pyrUp(gpB[i])
L = cv.subtract(gpB[i-1], GE)
lpB.append(L)
plt.subplot(2, 3, 6-i+1), plt.imshow(cv.cvtColor(L, cv.COLOR_BGR2RGB))
plt.show()
得到结果: 6、拼接。
LS = []
i = 1
for la, lb in zip(lpA, lpB):
print(la.shape)
rows, cols, dpt = la.shape
ls = np.hstack((la[:, 0: int(cols/2)], lb[:, int(cols/2) :]))
LS.append(ls)
plt.subplot(2, 3, i), plt.imshow(cv.cvtColor(ls, cv.COLOR_BGR2RGB))
i += 1
plt.show()
得到结果: 7、重建。
ls_ = LS[0] # 取出最模糊的那张图片
plt.subplot(2, 3, 1), plt.imshow(cv.cvtColor(ls_, cv.COLOR_BGR2RGB))
for i in range(1, 6):
ls_ = cv.pyrUp(ls_) # 加零,高斯模糊
ls_ = cv.add(ls_, LS[i]) # 加差值,提高分辨率
plt.subplot(2, 3, i+1), plt.imshow(cv.cvtColor(ls_, cv.COLOR_BGR2RGB))
plt.show()
得到结果: 8、对比结果。
# 对比直接拼接的效果
real = np.hstack((A[:, :int(cols/2)], B[:, int(cols/2):]))
plt.subplot(1, 2, 1), plt.imshow(cv.cvtColor(real, cv.COLOR_BGR2RGB))
plt.subplot(1, 2, 2), plt.imshow(cv.cvtColor(ls_, cv.COLOR_BGR2RGB))
得到结果: ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200117195222573.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM2NzU4OTE0,size_16,color_FFFFFF,t_70)
|