zoukankan      html  css  js  c++  java
  • Python+OpenCV图像处理之图像金字塔

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

    高斯金字塔:用于下采样。高斯金字塔是最基本的图像塔。原理:首先将原图像作为最底层图像G0(高斯金字塔的第0层),利用高斯核(5*5)对其进行卷积,然后对卷积后的图像进行下采样(去除偶数行和列)得到上一层图像G1,将此图像作为输入,重复卷积和下采样操作得到更上一层图像,反复迭代多次,形成一个金字塔形的图像数据结构,即高斯金字塔。

    拉普拉斯金字塔:用于重建图像,也就是预测残差,对图像进行最大程度的还原。比如一幅小图像重建为一幅大图,原理:用高斯金字塔的每一层图像减去其上一层图像上采样并高斯卷积之后的预测图像,得到一系列的差值图像即为 LP 分解图像。

    python实现

    import cv2
    import numpy as np
    
    
    __author__ = "boboa"
    
    
    # 高斯金字塔
    def pyramid_demo(image):
        level = 3
        temp = image.copy()
        pyramids_images = []  # 空列表
        for i in range(level):
            dst = cv2.pyrDown(temp)  # 先对图像进行高斯平滑,然后再进行降采样(将图像尺寸行和列方向缩减一半)
            pyramids_images.append(dst)  # 在列表末尾添加新的对象
            cv2.imshow("pyramid_down_"+str(i), dst)
            temp = dst.copy()
        return pyramids_images
    
    
    # 拉普拉斯金字塔
    def lapalian_demo(image):
        pyramids_images = pyramid_demo(image)  # 拉普拉斯金字塔必须用到高斯金字塔的结果
        level = len(pyramids_images)
        # 递减
        for i in range(level-1, -1, -1):
            if i - 1 < 0:
                expand = cv2.pyrUp(pyramids_images[i], dstsize=image.shape[0:2])
                lpls = cv2.subtract(image, expand)
                cv2.imshow("lapalian_down_" + str(i), lpls)
            else:
                expand = cv2.pyrUp(pyramids_images[i], dstsize=pyramids_images[i - 1].shape[:2])
                lpls = cv2.subtract(pyramids_images[i - 1], expand)
                cv2.imshow("lapalian_down_" + str(i), lpls)
    
    
    if __name__ == "__main__":
        img = cv2.imread("image/img2.jpg")
        cv2.namedWindow("input image", cv2.WINDOW_AUTOSIZE)
        cv2.imshow("input image", img)
        pyramid_demo(img)
        cv2.waitKey(0)
        cv2.destroyAllWindows()

    cv2.pyrDown函数先对图像进行高斯平滑,然后再进行降采样(将图像尺寸行和列方向缩减一半)

    pyrDown(src[, dst[, dstsize[, borderType]]]) -> dst

    参数:src-输入图像

         dst-输出图像,它与src类型、大小相同

         dstsize-降采样之后的目标图像的大小

         borderType-图像边界的处理方式

    cv2.pyrUp函数先对图像进行升采样(将图像尺寸行和列方向增大一倍),然后再进行高斯平滑。

    pyrUp(src[, dst[, dstsize[, borderType]]]) -> dst

    参数:src-输入图像

         dst-输出图像,它与src类型、大小相同

         dstsize-降采样之后的目标图像的大小

              borderType-图像边界的处理方式

    高斯金字塔运行结果

    拉普拉斯金字塔运行结果

  • 相关阅读:
    常用博客Metaweblog Api地址
    如何在Mac下配置Github和Bitbucket的SSH
    Java内部类持有外部类的引用详细分析与解决方案
    java 静态变量生命周期(类生命周期)
    比较List和ArrayList的性能及ArrayList和LinkedList优缺点
    List和ArrayList的区别
    hashmap可以用null为键值
    iOS各种调试技巧豪华套餐
    Split()[1]中的[1]是什么意思
    windows安装TortoiseGit详细使用教程
  • 原文地址:https://www.cnblogs.com/qianxia/p/11096601.html
Copyright © 2011-2022 走看看