图像金字塔——pyrDown和pyrUp

一、图像金字塔

(一)理论
图像金字塔由一副图像的多个不同分辨率的子图所构成的图像集合,最小图像可能仅仅有一个像素点。首先对原始图像进行滤波,得到原始图像的近似图像,再将近似图像的偶数行和偶数列删除以获取向下采样的结果。滤波器有:

  • 邻域滤波器:采用邻域平均技术求原始图像的近似图像,得到平均金字塔。
  • 高斯滤波器:采用高斯滤波器对原始图像进行滤波,得到高斯金字塔,通过pyrDown实现。

(二)函数
pyrDown函数:先对原始图像进行高斯滤波变换,以获取原始图像的近似图像,通过抛弃偶数行和偶数列来实现向下采样。
pyrUp函数:对图像向上采样时,在每个像素的右侧、下方分别插入零值行和列,用向下采样时所使用的高斯滤波器对新图像进行滤波,得到向上采样的结果。
(三)代码

# 高斯金字塔
def pyramid_demo(image):
    level = 3
    # 复制
    temp = image.copy()
    pyramid_images = []
    for i in range(level):
        """
        pyrDown(src, dst=None, dstsize=None, borderType=None):向下采样
            src:原始图像
            dst:目标图像
            dstsize:目标图像的大小
            borderType:边界类型,默认为BORDER_CONSTANT且仅支持它
        """
        dst = cv.pyrDown(temp)
        # 加入到里面
        pyramid_images.append(dst)
        cv.imshow('pyramid_demo' + str(i), dst)
        temp = dst.copy()
    return pyramid_images

在这里插入图片描述

二、拉普拉斯金字塔

1、作用

对金字塔中的小图像进行向上采样以获取完整的大尺寸高分辨率图像

2、原理
原理图
3、代码

# 拉普拉斯金字塔
def lapalian_demo(image):
    pyramid_images = pyramid_demo(image)
    # 计算层数
    level = len(pyramid_images)
    # 从高到底递减
    for i in range(level - 1, -1, -1):
        if (i - 1) < 0:
            # pyrUp:还原;最后一个原图减去expand
            expand = cv.pyrUp(pyramid_images[i], dstsize=image.shape[:2])
            # 用上一层减expand
            lpls = cv.subtract(image, expand)
            cv.imshow('lapalian_demo' + str(i), lpls)
        else:
            expand = cv.pyrUp(pyramid_images[i], dstsize=pyramid_images[i - 1].shape[:2])
            lpls = cv.subtract(pyramid_images[i - 1], expand)
            cv.imshow('lapalian_demo' + str(i), lpls)

拉普拉斯金字塔


版权声明:本文为weixin_45769285原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。