Opencv之图像金字塔--图像融合

图像金字塔

通常,我们过去使用的是恒定大小的图像。但是在某些情况下,我们需要使用不同分辨率的(相同)图像。例如,当在图像中搜索某些东西(例如人脸)时,我们不确定对象将以多大的尺寸显示在图像中。在这种情况下,我们将需要创建一组具有不同分辨率的相同图像,并在所有图像中搜索对象。这些具有不同分辨率的图像集称为“图像金字塔”(因为当它们堆叠在底部时,最高分辨率的图像位于顶部,最低分辨率的图像位于顶部时,看起来像金字塔)。
在这里插入图片描述

高斯金字塔:向下采样(缩小)

在这里插入图片描述

高斯金字塔:向上采样(放大)

在这里插入图片描述

拉普拉斯金字塔

在这里插入图片描述

举例–图像融合

要求

将苹果的左半边与橙子的右半边融合,得到新的“品种”。
在这里插入图片描述在这里插入图片描述

代码

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))

得到结果:
在这里插入图片描述

发布了36 篇原创文章 · 获赞 1 · 访问量 528

猜你喜欢

转载自blog.csdn.net/qq_36758914/article/details/104023971