欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python+OpenCV:图像金字塔

程序员文章站 2023-12-27 08:24:45
...

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

Python+OpenCV:图像金字塔

图像金字塔融合(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

Python+OpenCV:图像金字塔

上一篇:

下一篇: