图像金字塔
通常,我们过去使用的是恒定大小的图像。但是在某些情况下,我们需要使用不同分辨率的(相同)图像。例如,当在图像中搜索某些东西(例如人脸)时,我们不确定对象将以多大的尺寸显示在图像中。在这种情况下,我们将需要创建一组具有不同分辨率的相同图像,并在所有图像中搜索对象。这些具有不同分辨率的图像集称为“图像金字塔”(因为当它们堆叠在底部时,最高分辨率的图像位于顶部,最低分辨率的图像位于顶部时,看起来像金字塔)。
高斯金字塔:向下采样(缩小)
高斯金字塔:向上采样(放大)
拉普拉斯金字塔
举例–图像融合
要求
将苹果的左半边与橙子的右半边融合,得到新的“品种”。
代码
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))
得到结果: