• OpenCV 11(图像金字塔)


    一、 图像金字塔

    **图像金字塔**是图像中多尺度表达的一种,最主要用于图像的分割,是一种以多分辨率来解释图像的有效但概念简单的结构。简单来说, 图像金字塔是同一图像不同分辨率的子图集合.

    图像金字塔最初用于机器视觉和图像压缩。其通过梯次向下采样获得,直到达到某个终止条件才停止采样。金字塔的底部是待处理图像的高分辨率表示,而顶部是低分辨率的近似。我们将一层一层的图像比喻成金字塔,层级越高,则图像越小,分辨率越低

    **常见两类图像金字塔**

    **高斯金字塔 ( Gaussian pyramid)**: 用来向下/降采样,主要的图像金字塔
    **拉普拉斯金字塔(Laplacian pyramid)**: 用来从金字塔低层图像重建上层未采样图像,在数字图像处理中也即是预测残差,可以对图像进行最大程度的还原,配合高斯金字塔一起使用。 

    1.1 高斯金字塔

    **高斯金字塔**是通过高斯平滑和亚采样获得一系列下采样图像.

    原理非常简单, 如下图所示:

    原始图像 M * N -> 处理后图像 M/2 * N/2.

    每次处理后, 结果图像是原来的1/4.

    • 图片与卷积核卷积  -- 高斯平滑
    • 去除所有偶数的行和列 -- 图像缩小到原图的1/4 

    注意: 向下采样会丢失图像信息.

    - pyrDown 向下采样

    1. import cv2
    2. import numpy as np
    3. img = cv2.imread('./lena.png')
    4. print(img.shape)
    5. dst = cv2.pyrDown(img)
    6. print(dst.shape)
    7. cv2.imshow('img', img)
    8. cv2.imshow('dst', dst)
    9. cv2.waitKey(0)
    10. cv2.destroyAllWindows()

    - pyrUp 向上取样

      向上取样是向下取样的相反过程, 是指图片从小变大的过程.

     

    1. # 向上采样
    2. # 向下采样
    3. import cv2
    4. import numpy as np
    5. img = cv2.imread('./lena.png')
    6. print(img.shape)
    7. dst = cv2.pyrUp(img)
    8. print(dst.shape)
    9. cv2.imshow('img', img)
    10. cv2.imshow('dst', dst)
    11. cv2.waitKey(0)
    12. cv2.destroyAllWindows()

    - 取样可逆性研究

    ​        在根据向上和向下取样的原理, 我们能够发现图像在变大变小的过程中是有信息丢失的. 即使把图片变回原来大小,图片也不是原来的图片了, 而是损失了一定的信息.

    1. # 研究采样中图像的损失
    2. import cv2
    3. import numpy as np
    4. img = cv2.imread('./lena.png')
    5. # 先放大, 再缩小
    6. dst = cv2.pyrUp(img)
    7. dst = cv2.pyrDown(dst)
    8. cv2.imshow('img', img)
    9. cv2.imshow('dst', dst)
    10. cv2.imshow('loss', img - dst)
    11. cv2.waitKey(0)
    12. cv2.destroyAllWindows()

    1.2 拉普拉斯金字塔

    将降采样之后的图像再进行上采样操作,然后与之前还没降采样的原图进行做差得到残差图(为还原图像做信息的准备)

    也就是说,拉普拉斯金字塔是通过源图像减去先缩小后再放大的图像的一系列图像构成的。保留的是残差!

    残差就是丢失掉的信息。

    拉普拉斯金字塔是由高斯金字塔构成的没有专门的函数。

    拉普拉斯金字塔图像只像图像边缘,它的大部分元素都是0,用于图像压缩。

     

    1. # 研究采样中图像的损失
    2. import cv2
    3. import numpy as np
    4. img = cv2.imread('./lena.png')
    5. dst = cv2.pyrDown(img)
    6. dst = cv2.pyrUp(dst)
    7. lap0 = img - dst
    8. cv2.imshow('img', img)
    9. cv2.imshow('dst', dst)
    10. cv2.imshow('lap0', lap0)
    11. cv2.waitKey(0)
    12. cv2.destroyAllWindows()

    1. # 研究采样中图像的损失
    2. import cv2
    3. import numpy as np
    4. img = cv2.imread('./lena.png')
    5. dst = cv2.pyrDown(img)
    6. dst = cv2.pyrUp(dst)
    7. lap0 = img - dst
    8. cv2.imshow('img', img)
    9. cv2.imshow('dst', dst)
    10. cv2.imshow('lap0', lap0)
    11. 第二层拉普拉斯效果:
    12. dst1 = cv2.pyrDown(dst)
    13. dst2 = cv2.pyrUp(dst1)
    14. lap1 = dst - dst2
    15. cv2.imshow('lap1 ', lap1)
    16. cv2.waitKey(0)
    17. cv2.destroyAllWindows()

     

  • 相关阅读:
    posix定时器的使用
    300页13万字新型智慧城市云平台中心及大数据平台建设方案
    JAVA麦克风实时录音调用听写并存储音频到本地
    接口测试系列之 —— 前端交互测试和后端逻辑测试
    释放数据价值的真正法宝,数据要素市场化开发迫在眉睫
    数字医疗解决方案:互联网医院平台的创新应用
    【图像融合】基于RP、CVT、DTCWT、NSCT-SR+DWT-SR+拉普拉斯金字塔算法-SR等实现MRT图像融合附matlab源码
    飞桨中国行落地广州 共探企业智能化升级新路径
    Kafka安装启动(含安装包)
    Kubernetes 网络排查方法
  • 原文地址:https://blog.csdn.net/peng_258/article/details/132779070