一、 图像金字塔
**图像金字塔**是图像中多尺度表达的一种,最主要用于图像的分割,是一种以多分辨率来解释图像的有效但概念简单的结构。简单来说, 图像金字塔是同一图像不同分辨率的子图集合.
图像金字塔最初用于机器视觉和图像压缩。其通过梯次向下采样获得,直到达到某个终止条件才停止采样。金字塔的底部是待处理图像的高分辨率表示,而顶部是低分辨率的近似。我们将一层一层的图像比喻成金字塔,层级越高,则图像越小,分辨率越低。
**常见两类图像金字塔**
**高斯金字塔 ( Gaussian pyramid)**: 用来向下/降采样,主要的图像金字塔
**拉普拉斯金字塔(Laplacian pyramid)**: 用来从金字塔低层图像重建上层未采样图像,在数字图像处理中也即是预测残差,可以对图像进行最大程度的还原,配合高斯金字塔一起使用。
1.1 高斯金字塔
**高斯金字塔**是通过高斯平滑和亚采样获得一系列下采样图像.
原理非常简单, 如下图所示:
原始图像 M * N -> 处理后图像 M/2 * N/2.
每次处理后, 结果图像是原来的1/4.
- 图片与卷积核卷积 -- 高斯平滑
- 去除所有偶数的行和列 -- 图像缩小到原图的1/4
注意: 向下采样会丢失图像信息.
- pyrDown 向下采样
import cv2
import numpy as npimg = 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 cv2import numpy as npimg = 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 npimg = cv2.imread('./lena.png')# 先放大, 再缩小
dst = cv2.pyrUp(img)
dst = cv2.pyrDown(dst)cv2.imshow('img', img)
cv2.imshow('dst', dst)
cv2.imshow('loss', img - dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
1.2 拉普拉斯金字塔
将降采样之后的图像再进行上采样操作,然后与之前还没降采样的原图进行做差得到残差图(为还原图像做信息的准备)!
也就是说,拉普拉斯金字塔是通过源图像减去先缩小后再放大的图像的一系列图像构成的。保留的是残差!
残差就是丢失掉的信息。
拉普拉斯金字塔是由高斯金字塔构成的没有专门的函数。
拉普拉斯金字塔图像只像图像边缘,它的大部分元素都是0,用于图像压缩。
# 研究采样中图像的损失
import cv2
import numpy as npimg = cv2.imread('./lena.png')dst = cv2.pyrDown(img)
dst = cv2.pyrUp(dst)lap0 = img - dst
cv2.imshow('img', img)
cv2.imshow('dst', dst)
cv2.imshow('lap0', lap0)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 研究采样中图像的损失
import cv2
import numpy as npimg = cv2.imread('./lena.png')dst = cv2.pyrDown(img)
dst = cv2.pyrUp(dst)lap0 = img - dst
cv2.imshow('img', img)
cv2.imshow('dst', dst)
cv2.imshow('lap0', lap0)第二层拉普拉斯效果:
dst1 = cv2.pyrDown(dst)
dst2 = cv2.pyrUp(dst1)
lap1 = dst - dst2
cv2.imshow('lap1 ', lap1)cv2.waitKey(0)
cv2.destroyAllWindows()