图像金字塔
图像金字塔是图像多尺度表达的一种,是一种以多分辨率来解释图像的有效但概念简单的结构。图像金字塔最初用于机器视觉和图像压缩,一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合。其通过梯次向下采样获得,直到达到某个终止条件才停止采样。我们将一层一层的图像比喻成金字塔,层级越高,则图像越小,分辨率越低。
从上面对图像金字塔的定义来看,图像金字塔的功能之一就是对图像尺度尺度的转换,即放大或者缩小图片,在OpenCV中提供了两种方法:
- cv2.resize()函数,这种方法可直接对图像进行尺度的变换,在我的博客 图像的简单几何变换 中,提供了相应的示例。
- cv2.pyrUp()、cv2.pyrDown()函数。这是与图像金字塔相关的两个函数,分别是对图像的向上采样、向下采样操作。
图像金字塔一般有两种类型:
- 高斯金字塔(Gaussianpyramid):用来向下采样,是主要的图像金字塔。
- 拉普拉斯金字塔(Laplacianpyramid):用来从金字塔底层图像重建上层未采样图像,在数字图像处理中也就是预测残差,可以对图像进行最大程度的还原,配合高斯金字塔一起使用。
两者的简要区别:高斯金字塔用来向下采样图像,而拉普拉斯金字塔则用来从金字塔底层图像中向上采样重建一个图像。
在OpenCV中:
- 对图像向上采样:pyrUp()函数
- 对图像向下采样:pyrDown()函数
img = cv2.imread('luotuo.jpg', 0) # 读为灰度图
up_img = cv2.pyrUp(img) # 上采样操作
img_1 = cv2.pyrDown(img) # 下采样操作
img_2 = cv2.pyrDown(img_1)
cv2.imshow('up_img', up_img)
cv2.imshow('img', img)
cv2.imshow('img_1', img_1)
cv2.imshow('img_2', img_2)
cv2.waitKey(0)
cv2.destroyAllWindows()
这里的向下与向上采样是对图像的尺度来说的 ,相当于倒立的金字塔,向上就是图像尺寸加倍,向下就是图像尺寸减半。
需要注意的是,pyrUp和pyrDown不是互逆的,即上采样不是下采样的逆操作。
pyrDown()是一个会丢失信息的函数。为了恢复原来更高分辨率的图像,要获得由于下采样操作所丢失的信息,这些数据就和拉普拉斯金字塔有关了。
图像的拉普拉斯金字塔可以由图像的高斯金字塔得到,转换的公式为:
img = cv2.imread('3.jpg', 0)
img1 = cv2.pyrDown(img) # 高斯金字塔
_img1 = cv2.pyrDown(img1)
_img = cv2.pyrUp(_img1)
img2 = img1 - _img # 拉普拉斯金字塔
cv2.imshow('img1', img1)
cv2.imshow('img2', img2)
cv2.waitKey(0)
cv2.destroyAllWindows()
拉普拉斯金字塔的图像看起来就像是边界图。经常被用在图像压缩中。
关于图像的放大和缩小,个人认为还是使用resize()函数比较好,因为他不会使图像变得特别模糊,而且非常简便。这里再对之前的resize函数知识再做一些补充。
第六个参数,int类型的interpolation,用于指定插值方式,默认为INTER_LINEAR(线性插值)。
可选的插值方式如下:
- INTER_NEAREST - 最近邻插值
- INTER_LINEAR - 线性插值(默认值)
- INTER_AREA - 区域插值(利用像素区域关系的重采样插值)
- INTER_CUBIC –三次样条插值(超过4×4像素邻域内的双三次插值)
- INTER_LANCZOS4 -Lanczos插值(超过8×8像素邻域的Lanczos插值)
若要缩小图像,一般情况下最好用CV_INTER_AREA来插值,
而若要放大图像,一般情况下最好用CV_INTER_CUBIC(效率不高,慢,不推荐使用)或CV_INTER_LINEAR(效率较高,速度较快,推荐使用)。
修仙路上不孤单,两位道友的博客,欢迎关注。
https://me.csdn.net/qq_41007606
https://me.csdn.net/weixin_38877564