图像金字塔

图像金字塔是图像多尺度表达的一种,是一种以多分辨率来解释图像的有效但概念简单的结构。一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合。其通过梯次向下采样获得,直到达到某个终止条件才停止采样。我们将一层一层的图像比喻成金字塔,层级越高,则图像越小,分辨率越低。百度百科

  • reduce= 高斯模糊+降采样
  • expand= 扩大+卷积

相关代码

import cv2 as cv
import numpy as np


def pyramid_demo(image):
    # 定义金字塔层数
    level = 3
    # 拷贝图像
    temp = image.copy()
    # 定义返回的图像
    pyramid_images = []
    for i in range(level):
        # reduce过程
        dst = cv.pyrDown(temp)
        pyramid_images.append(dst)
        cv.imshow("pyramid_down_" + str(i), dst)
        # reduce 之后的图像重新复制给temp
        temp = dst.copy()
    return pyramid_images


def lapalian_demo(image):
    """ 拉普拉斯金字塔 拉普拉斯金字塔是通过源图像减去先缩小后再放大的图像的一系列图像构成的 pyrUp 使用时如果添加dstsize的参数 则需要保证传入的size的长和宽需要一样 :param image: :return: """
    pyramid_images = pyramid_demo(image)
    level = len(pyramid_images)
    # 从高到低
    for i in range(level - 1, -1, -1):
        if (i - 1) < 0:
            # 参数:输入的图像 模板图像的大小
            expand = cv.pyrUp(pyramid_images[i])
            # 注意大小的顺序时反着的
            resize2 = (expand.shape[1], expand.shape[0])
            # 相减时需要图片的大小一样 所有重新调整大小
            image = cv.resize(image, resize2)
            lpls = cv.subtract(image, expand)
            cv.imshow("lapalian_down_" + str(i), lpls)
        else:
            expand = cv.pyrUp(pyramid_images[i])
            resize1 = (expand.shape[1], expand.shape[0])
            image = cv.resize(image, resize1)
            lpls = cv.subtract(image, expand)
            cv.imshow("lapalian_down_" + str(i), lpls)


def pyrup_demo(image):
    """ 使用pyrUp函数可以给图像扩大 :param image: :return: """
    expand = cv.pyrUp(image)
    cv.imshow('UP', expand)


src = cv.imread("tree.jpg")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
# pyramid_demo(src)
lapalian_demo(src)
cv.waitKey(0)

cv.destroyAllWindows()

注意事项

  • 使用时如果添加dstsize的参数 则需要保证传入的size的长和宽需要一样,所有可以不指定大小

结果展示

参考博客

图像金字塔(高斯金字塔、拉普拉斯金字塔)