Python+OpenCV:图像金字塔

82 篇文章 20 订阅

Python+OpenCV:图像金字塔

理论

通常情况下,我们使用固定大小的图像。但在某些情况下,我们需要处理(相同的)不同分辨率的图像。

例如,当搜索图像中的某些东西时,比如脸,我们不确定该物体在图像中呈现的大小。

在这种情况下,我们将需要创建一组具有不同分辨率的相同图像,并在所有这些图像中搜索对象。

这些具有不同分辨率的图像集合被称为图像金字塔(因为当它们被保存在一个堆栈中,最高分辨率的图像在底部,最低分辨率的图像在顶部,它看起来像一个金字塔)。

图像金字塔有两种:1)Gaussian 金字塔;2)Laplacian 金字塔

Gaussian金字塔中的高水平(低分辨率)是通过去除低水平(高分辨率)图像中连续的行和列而形成的。然后,利用下一层5个像素的高斯权值贡献,形成上一层的每个像素。

这样,一个M×N的图像就变成了M/2×N/2的图像。所以面积减少到原来的1 / 4。它被称为倍频。当我们进入金字塔的上部时,同样的模式继续(即分辨率降低)。

同样地,当扩展时,每层面积将变成4倍。我们可以使用cvv.pyrdown()和cvv.pyrup()函数找到高斯金字塔。

Laplacian金字塔是由Gaussian金字塔构成的。它没有专门的功能。Laplacian金字塔图像只是像边缘图像。它的大多数元素都是0。它们被用于图像压缩。

Laplacian金字塔中的层次是由Gaussian金字塔中的层次与Gaussian金字塔中上层层次的扩展形式的差而形成的。

示例

####################################################################################################
# 图像金字塔(Image Pyramids)
def lmc_cv_image_pyramids():
    """
        函数功能: 图像金字塔(Image Pyramids).
    """

    # 读取图像
    image = lmc_cv.imread('D:/99-Research/Python/Image/Lena.jpg')
    image = lmc_cv.cvtColor(image, lmc_cv.COLOR_RGB2BGR)

    # 图像金字塔(Image Pyramids)
    pyr_down_image1 = lmc_cv.pyrDown(image)
    pyr_down_image2 = lmc_cv.pyrDown(pyr_down_image1)
    pyr_down_image3 = lmc_cv.pyrDown(pyr_down_image2)
    pyr_down_image4 = lmc_cv.pyrDown(pyr_down_image3)
    pyr_down_image5 = lmc_cv.pyrDown(pyr_down_image4)

    # 显示图像
    pyplot.figure('Image Display')
    titles = ['Original Image', 'Down Pyramids 1', 'Down Pyramids 2', 'Down Pyramids 3', 'Down Pyramids 4',
              'Down Pyramids 5']
    images = [image, pyr_down_image1, pyr_down_image2, pyr_down_image3, pyr_down_image4, pyr_down_image5]
    for i in range(6):
        pyplot.subplot(2, 3, i + 1)
        pyplot.imshow(images[i], 'gray')
        pyplot.title(titles[i])
        pyplot.xticks([])
        pyplot.yticks([])
    pyplot.show()

    # 根据用户输入保存图像
    if ord("q") == (lmc_cv.waitKey(0) & 0xFF):
        # 销毁窗口
        pyplot.close()
    return

图像金字塔融合(Image Pyramids Blending)

####################################################################################################
# 图像金字塔融合(Image Pyramids Blending)
def lmc_cv_image_pyramids_blending():
    """
        函数功能: 图像金字塔融合(Image Pyramids Blending).
    """

    # 读取图像
    image1 = lmc_cv.imread('D:/99-Research/Python/Image/apple.jpg')
    image2 = lmc_cv.imread('D:/99-Research/Python/Image/orange.jpg')
    image1 = lmc_cv.cvtColor(image1, lmc_cv.COLOR_RGB2BGR)
    image2 = lmc_cv.cvtColor(image2, lmc_cv.COLOR_RGB2BGR)

    # 图像金字塔融合(Image Pyramids Blending)
    # generate Gaussian pyramid for image1
    copy_image = image1.copy()
    gp_image1 = [copy_image]
    for i in range(6):
        copy_image = lmc_cv.pyrDown(copy_image)
        gp_image1.append(copy_image)

    # generate Gaussian pyramid for image2
    copy_image = image2.copy()
    gp_image2 = [copy_image]
    for i in range(6):
        copy_image = lmc_cv.pyrDown(copy_image)
        gp_image2.append(copy_image)

    # generate Laplacian Pyramid for image1
    lp_image1 = [gp_image1[5]]
    for i in range(5, 0, -1):
        ge_image = lmc_cv.pyrUp(gp_image1[i])
        lp_image = lmc_cv.subtract(gp_image1[i - 1], ge_image)
        lp_image1.append(lp_image)

    # generate Laplacian Pyramid for image2
    lp_image2 = [gp_image2[5]]
    for i in range(5, 0, -1):
        ge_image = lmc_cv.pyrUp(gp_image2[i])
        lp_image = lmc_cv.subtract(gp_image2[i - 1], ge_image)
        lp_image2.append(lp_image)

    # Now add left and right halves of images in each level
    ls_image = []
    for la, lb in zip(lp_image1, lp_image2):
        rows, cols, dpt = la.shape
        ls = np.hstack((la[:, 0:cols // 2], lb[:, cols // 2:]))
        ls_image.append(ls)

    # now reconstruct
    reconstruct_image = ls_image[0]
    for i in range(1, 6):
        reconstruct_image = lmc_cv.pyrUp(reconstruct_image)
        reconstruct_image = lmc_cv.add(reconstruct_image, ls_image[i])

    # image with direct connecting each half
    real_image = np.hstack((image1[:, :cols // 2], image2[:, cols // 2:]))

    # 显示图像
    pyplot.figure('Image Display')
    titles = ['Original Image 1', 'Original Image 2', 'Image Pyramids Blending', 'Image Direct Blending']
    images = [image1, image2, reconstruct_image, real_image]
    for i in range(4):
        pyplot.subplot(2, 2, i + 1)
        pyplot.imshow(images[i], 'gray')
        pyplot.title(titles[i])
        pyplot.xticks([])
        pyplot.yticks([])
    pyplot.show()

    # 根据用户输入保存图像
    if ord("q") == (lmc_cv.waitKey(0) & 0xFF):
        # 销毁窗口
        pyplot.close()
    return

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值