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

图像金字塔

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

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

在这里插入图片描述

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

在这里插入图片描述

拉普拉斯金字塔

用来从金字塔低层图像重建上层未采样图像,在数字图像处理中也即是预测残差,可以对图像进行最大程度的还原从而重建高斯金字塔。
PryDown( )是一个会丢失信息的函数,所以不能通过先降采样再升采样来获得原始图像,那么,先降再升后的图片与原始图片之间的差就是降采样操作丢失的信息。为了恢复原来更高的分辨率的图像,引入拉普拉斯金字塔。
在这里插入图片描述

举例–图像融合

要求

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

代码

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

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

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cofisher

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值