OpenCV学习笔记12-图像金字塔的原理及代码实现

文章目录

  • 1 图像金字塔介绍
  • 2 高斯金字塔
  • 3 拉普拉斯金字塔

1 图像金字塔介绍

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

图像金字塔最初用于机器视觉和图像压缩,一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合。其通过梯次向下采样获得,直到达到某个终止条件才停止采样。金字塔的底部是待处理图像的高分辨率表示,而顶部是低分辨率的近似。我们将一层一层的图像比喻成金字塔,层级越高,则图像越小,分辨率越低。

  • 图像金字塔和卷积核没关系,它有自己的算法
  • 图像金字塔只能按照等整数比例缩放,不想resize那样任意缩放,例如原来图像的像素为(800 * 800),图像金字塔不能缩放到

(500 * 500),但是可以缩放到(400 * 400)或者(200 * 200)

OpenCV学习笔记12-图像金字塔的原理及代码实现_第1张图片

常见两类图像金字塔

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

2 高斯金字塔

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

比如256*256的图像,进行一次间隔为2的下采样,就变成了128×128的子图像,再来一次,就变成了64×64,依此类推。。说白了,采样也好,采样也好,都是只取原序列或者原图像的一部分数据。

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

OpenCV学习笔记12-图像金字塔的原理及代码实现_第2张图片

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

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

OpenCV学习笔记12-图像金字塔的原理及代码实现_第3张图片

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

cv2.pyrDown(src[, dst[, dstsize[, borderType]]]) 向下采样

  • src 传入的图像
  • dst 输出图像
  • dstsize 输出图片的大小
  • borderType 边界类型

向上取样

cv2.pyrUp(src[, dst[, dstsize[, borderType]]]

  • src 传入的图像
  • dst 输出图像
  • dstsize 输出图片的大小
  • borderType 边界类型

向上取样是向下取样的相反过程, 是指图片从小变大的过程.(也会模糊图像)

OpenCV学习笔记12-图像金字塔的原理及代码实现_第4张图片

高斯金字塔取样不可逆!!!采样的过程中会失真,造成像素的损失。

  • pyrDown 向下采样
import cv2
import numpy as np

img = cv2.imread('./lena.png')

print(img.shape)
dst = cv2.pyrDown(img)

print(dst.shape)

cv2.imshow('img', img)
cv2.imshow('dst', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
  • pyrUp 向上采样

    # 向上采样
    # 向下采样
    import cv2
    import numpy as np
    
    
    img = cv2.imread('./lena.png')
    
    print(img.shape)
    dst = cv2.pyrUp(img)
    
    print(dst.shape)
    
    cv2.imshow('img', img)
    cv2.imshow('dst', dst)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

  • 取样可逆性研究

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

import cv2
import numpy as np

img = cv2.imread('./lena.png')


# 分辨率减小的操作, 下采样
dst = cv2.pyrUp(img)
# 分辨率增大的操作,上采样
dst = cv2.pyrDown(dst)

cv2.imshow('img', img)
cv2.imshow('dst', dst)
# 展示取样中缺失的数据
cv2.imshow('miss', img - dst)

cv2.waitKey(0)
cv2.destroyAllWindows()

3 拉普拉斯金字塔

没有具体的算法,只有相关的数学公式和思想

OpenCV学习笔记12-图像金字塔的原理及代码实现_第5张图片

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

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

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

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NoKKbpuG-1650968175279)(D:\Desktop\daxue\MSB\AIoT\机器视觉\day11_图像金字塔和图像直方图\课件\img\93b66329c979ce45344e62dbb36a5dd.png)]

OpenCV学习笔记12-图像金字塔的原理及代码实现_第6张图片

import cv2
import numpy as np

img = cv2.imread('./lena.png')

# 先缩小
dst = cv2.pyrDown(img)
# 再放大
dst = cv2.pyrUp(dst)
# 原图 和高斯金字塔的差就是拉普拉斯金字塔
lap0 = img - dst

# 第二层拉普拉斯金字塔
dst1 = cv2.pyrDown(dst)
# 再放大
dst1 = cv2.pyrUp(dst1)
# 原图 和高斯金字塔的差就是拉普拉斯金字塔
lap1 = dst - dst1

cv2.imshow('img', img)
cv2.imshow('lap0', lap0)
cv2.imshow('lap1', lap1)

cv2.waitKey(0)
cv2.destroyAllWindows()


附OpenCV目录:OpenCV总目录学习笔记

智科专业小白,写博文不容易,如果喜欢的话可以点个赞哦!请添加图片描述

你可能感兴趣的:(机器视觉,python,人工智能,计算机视觉,jupyter)