• OpenCV-Python快速入门(八):图像金字塔


    前言

    • 本文是个人快速入门OpenCV-Python的电子笔记,由于水平有限,难免出现错漏,敬请批评改正。
    • 更多精彩内容,可点击进入
      OpenCV-Python快速入门
      专栏或我的个人主页查看

    前提条件

    实验环境

    • Python 3.x (面向对象的高级语言)
    • OpenCV 4.0(python第三方库)pip3 install opencv-python

    图像金字塔

    • 图像金字塔是由一幅图像的多个不同分辨率的子图所构成的图像集合。该组图像是由单个图像通过不断地降采样所产生的,最小的图像可能仅仅有一个像素点。
    • 图像金字塔是一系列以金字塔形状排列的、自底向上分辨率逐渐降低的图像集合。
      在这里插入图片描述

    高斯金字塔

    • 高斯金字塔是通过不断地使用高斯金字塔滤波、采样所产生的,图像金字塔操作中的向下采样流程,如下图所示。
      图像金字塔操作中的向下采样流程
    • 注:需要了解高斯滤波的,可查阅OpenCV-Python快速入门(六):图像平滑

    cv2.pyrDown()实现图像金字塔

    import cv2
    import numpy as np
    
    img1=cv2.imread("1.jpg")
    img1_resize=cv2.resize(img1,(400,400))
    '''
    dst = cv2.pyrDown( src[, dstsize[, borderType]] )
    参数说明:
        dst 为目标图像。
        src 为原始图像。
        dstsize 为目标图像的大小。
        borderType 为边界类型 , 默认值为BORDER_DEFAULT , 
        且这里仅支持BORDER_DEFAULT。
    '''
    r1=cv2.pyrDown(img1_resize)
    r2=cv2.pyrDown(r1)
    r3=cv2.pyrDown(r2)
    cv2.imshow("origin",img1_resize)
    cv2.imshow("r1",r1)
    cv2.imshow("r2",r2)
    cv2.imshow("r3",r3)
    cv2.waitKey()
    cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    在这里插入图片描述

    cv2.pyrUp()实现图像金字塔

    import cv2
    import numpy as np
    
    img1=cv2.imread("1.jpg")
    img1_resize=cv2.resize(img1,(50,50))
    '''
    dst = cv2.pyrUp( src[, dstsize[, borderType]] )
    参数说明:
        dst 为目标图像。
        src 为原始图像。
        dstsize 为目标图像的大小。
        borderType 为边界类型 , 默认值为BORDER_DEFAULT , 
        且这里仅支持BORDER_DEFAULT。
    '''
    r1=cv2.pyrUp(img1_resize)
    r2=cv2.pyrUp(r1)
    r3=cv2.pyrUp(r2)
    cv2.imshow("origin",img1_resize)
    cv2.imshow("r1",r1)
    cv2.imshow("r2",r2)
    cv2.imshow("r3",r3)
    cv2.waitKey()
    cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    在这里插入图片描述

    拉普拉斯金字塔

    • 一幅图像在经过向下采样后,再对其进行向上采样,是无法恢复为原始状态的。
    • 向上采样并不是向下采样的逆运算。这是很明显的,因为向下采样时在使用高斯滤波器处理后还要抛弃偶数行和偶数列,不可避免地要丢失一些信息。
    • 为了在向上采样时能够恢复具有较高分辨率的原始图像,就要获取在采样过程中所丢失的信息,这些丢失的信息就构成了拉普拉斯金字塔。
    • 拉普拉斯金字塔的定义为 L i = G i − p y r U p ( G i + 1 ) L_i = G_i - pyrUp(G_i + 1) Li=GipyrUp(Gi+1)其中, L i L_i Li 表示拉普拉斯金字塔中的第 i i i层。 G i G_i Gi表示高斯金字塔中的第 i i i层。
      在这里插入图片描述

    cv2.pyrDown()和 cv2.pyrUp()构造拉普拉斯金字塔

    import cv2
    import numpy as np
    
    img1=cv2.imread("1.jpg")
    img1_resize=cv2.resize(img1,(400,400))
    '''
    dst = cv2.pyrDown( src[, dstsize[, borderType]] )
    dst = cv2.pyrUp( src[, dstsize[, borderType]] )
    参数说明:
        dst 为目标图像。
        src 为原始图像。
        dstsize 为目标图像的大小。
        borderType 为边界类型 , 默认值为BORDER_DEFAULT , 
        且这里仅支持BORDER_DEFAULT。
    '''
    G0=img1_resize
    G1=cv2.pyrDown(G0)
    G2=cv2.pyrDown(G1)
    G3=cv2.pyrDown(G2)
    L0=G0-cv2.pyrUp(G1)
    L1=G1-cv2.pyrUp(G2)
    L2=G2-cv2.pyrUp(G3)
    cv2.imshow("L0",L0)
    cv2.imshow("L1",L1)
    cv2.imshow("L2",L2)
    cv2.waitKey()
    cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    在这里插入图片描述

    应用:恢复高分辨率图像

    import cv2
    import numpy as np
    
    img1=cv2.imread("1.jpg")
    img1_resize=cv2.resize(img1,(400,400))
    '''
    dst = cv2.pyrDown( src[, dstsize[, borderType]] )
    dst = cv2.pyrUp( src[, dstsize[, borderType]] )
    参数说明:
        dst 为目标图像。
        src 为原始图像。
        dstsize 为目标图像的大小。
        borderType 为边界类型 , 默认值为BORDER_DEFAULT , 
        且这里仅支持BORDER_DEFAULT。
    '''
    G0=img1_resize
    G1=cv2.pyrDown(G0)
    L0=G0-cv2.pyrUp(G1)
    RO=L0+cv2.pyrUp(G1) # 通过拉普拉斯图像复原的原始图像
    print("GO.shape=",G0.shape)
    print("RO.shape=",RO.shape)
    res=RO-G0 # 将 G0 和 RO 做减法运算
    # 计算 res 的绝对值,避免求和时负负为正,3+(-3)=0
    res=abs(res)
    # 计算 res 所有元素的和
    print("原始图像 GO 与恢复图像 RO 之差的绝对值和:",np.sum(res))
    cv2.imshow("Origin_img_G0",G0)
    cv2.imshow("Laplacian_img_L0",L0)
    cv2.imshow("Restore_img_RO",RO)
    cv2.waitKey()
    cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    在这里插入图片描述
    在这里插入图片描述

    参考文献

    [1] https://opencv.org/
    [2] 李立宗. OpenCV轻松入门:面向Python. 北京: 电子工业出版社,2019

  • 相关阅读:
    将设计模式门面模式运用到生活当中
    c语言、c++扩展介绍 ————柔性数组、零长数组。
    shiro-第二篇-整合springboot
    中国移动云能力中心(苏小研)--秋招面经(已offer)
    Python基础
    基于支持向量机的试剂条图像识别,基于SVM的图像识别,SVM的详细原理,Libsvm工具箱使用注意事项
    nginx转发apache,跳转丢失端口,直接带的是apache的端口
    《算法竞赛进阶指南》蚯蚓
    必须收藏!没有经验的程序员该怎么找工作?
    读书笔记:Head First Java实战(第三版)
  • 原文地址:https://blog.csdn.net/FriendshipTang/article/details/126063997