• 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()

     

  • 相关阅读:
    Pytorch实战教程(二十七)-基于ResNet模型实现猫狗分类
    快收下这份拼接视频方法攻略,制作出你想要的视频
    ARR过亿,甄云科技姚一鸣:奔向数字采购标准化时代
    《Mycat分布式数据库架构》之原理
    84.(cesium之家)cesium模型在地形上运动
    腾讯P8架构师耗时2个月整理的Redis全套学习笔记,涵盖所有核心知识点
    Day709.JShell -Java8后最重要新特性
    破解wifi密码 暴力破解 保姆式教学
    26k Star, 理解Git太轻松了。。。
    详细介绍NLP关键词提取算法
  • 原文地址:https://blog.csdn.net/peng_258/article/details/132779070