图像金字塔是由一幅图像的多个不同分辨率的子图所构成的图像集合。该组图像是由单个图像不断地降采样所产生的。
1.理论基础
图像金字塔是同一图像不同分辨率的子图集合,由原图像通过不断地向下采样产生。最简单的图像金字塔可以通过删除图像的偶数行和偶数列得到。这样图像大小变为原来的四分之一。
也可以通过对原始图像滤波,得到原始图像的近似图像,然后对近似图像删除偶数行和偶数列,从而获取向下采样的结果。有多种滤波器可以选择,例如:邻域滤波器和高斯滤波器,从而可以得到平均金字塔(由邻域滤波器产生)和高斯金字塔(由高斯滤波器产生)。
在向上采样过程中,通常将图像的宽度和高度都变为原来的2倍,这意味着图像大小需要变为原来的4倍,这就需要补充大量的像素点。对新生的像素点进行赋值,称为插值处理。有一种常见的向上采样,对像素点以补零的方式完成插值,通常向右(下)插入值为零的列(行)。完成插值后,使用向下采样是所用到的高斯核进行滤波。要注意,此时图像中四分之三的像素点的值都是零,所以要将高斯滤波器的系数乘以4,以保证得到像素值范围在原有的像素范围内。
向上采样和向下采样是相反的两种操作,但是由于向下采样会丢失像素值,所以这两种操作并不是可逆的。
2.pyrDown函数
为了实现高斯金字塔,OpenCV提供了函数:
dst: 为目标图像
src: 为原始图像
dtsize: 为目标图像的大小,默认情况下,输出图像的大小为Size((src.cols+1)/2,(src.rows+1)/2),且任何情况下,图像尺寸必须满足:
borderType: 为边界类型,默认值cv2.BORDER_DEFAULT。
该函数首先对原始图像进行高斯滤波转换,获取原始图像的近似值,然后通过抛弃偶数行和偶数列来实现向下采样。
例如:
![](https://img.haomeiwen.com/i15722988/c19b0a834ce4ca85.png)
![](https://img.haomeiwen.com/i15722988/48799b77f747dd37.png)
可以看到,经过向下采样,图像的分辨率变低了。
3.pyrUp函数
为实现向上采样,OpenCV提供了函数:
dst: 为目标图像
src: 为原始图像
dtsize: 为目标图像的大小
borderType: 为边界类型,默认值cv2.BORDER_DEFAULT。
默认情况下,图像的大小为。
在任何情况下,图像尺寸需要满足条件:
图像向上采样时,在每个图像的右侧、下方分别插入零值列和行,然后用乡下采样时用的高斯核进行滤波,得到向上采样的结果图。为保证像素值区间和原始图像保持一致,需要将高斯核的系数乘以4。这就是pyrUp()函数所做的工作。
例如:
![](https://img.haomeiwen.com/i15722988/c2f03c10c86ee3d3.png)
![](https://img.haomeiwen.com/i15722988/48f9d3912fe74d1d.png)
另外,图像先向下采样,再向上采样,虽然图像的尺寸变为原来的大小了,且效果看起来相似,但像素值是不相等的。即采样是不可逆的。
4.拉普拉斯金字塔
拉普拉斯金字塔可以用于这个场景:有时候我们希望通过对金字塔中的小图像进行向上采样,以获取完整的大尺寸高分辨率的图像。
为了在向上采样时能恢复具有较高分辨率的原始图像,需要获取在采样过程中损失的信息,这些丢失的信息就构成了拉普拉斯金字塔。拉普拉斯金字塔的定义形式:
Li : 表示拉普拉斯金字塔的的第i层;
Gi : 表示高斯金字塔的第i层
例如:
![](https://img.haomeiwen.com/i15722988/48e7636ab84e525c.png)
![](https://img.haomeiwen.com/i15722988/9ef8e20d9f7049a4.png)
![](https://img.haomeiwen.com/i15722988/1f9e504d346e395e.png)
网友评论