Opencv之图像金字塔

您所在的位置:网站首页 橙子与橘子图片 Opencv之图像金字塔

Opencv之图像金字塔

2024-07-13 07:24| 来源: 网络整理| 查看: 265

图像金字塔

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

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

在这里插入图片描述

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

在这里插入图片描述

拉普拉斯金字塔

用来从金字塔低层图像重建上层未采样图像,在数字图像处理中也即是预测残差,可以对图像进行最大程度的还原从而重建高斯金字塔。 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))

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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3