图像金字塔是图像多尺度表达的一种,是一种以多分辨率来解释图像的有效且概念简单的结构。一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合。
高斯金字塔是常见的图像金字塔,如下所示:
高斯金字塔构造过程如下:
-
对第i层进行高斯滤波,高斯滤波核如下:
-
删除滤波后图像的偶数行和偶数列
经过上面两个步骤得到一个原图1/4大的图像,这便完成了一次降采样。通过反复迭代便可以得到一幅图像的金字塔表示。
可以经过相反步骤完成上采样得到一幅4倍大的图像。
-
将原图行列都扩大两倍,新增行列用0填充
-
在扩大后的图像上进行高斯滤波,滤波核为上面的滤波核乘以4
代码
#include<opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
Mat src = imread("G:\\opencvDemo\\lena.jpg");
Mat dstimage;
pyrDown(src, dstimage, Size(src.cols / 2, src.rows / 2));
pyrUp(dstimage, dstimage, Size(dstimage.cols * 2, dstimage.rows * 2));
imshow("srcImg", src);
imshow("dstImg", dstimage);
waitKey(0);
return 0;
}
先将原图缩小然后再放大,结果如下。
原图:
下采样图像:
上采样图像:
OpenCV API
void cv::pyrDown ( InputArray src,
OutputArray dst,
const Size & dstsize = Size(),
int borderType = BORDER_DEFAULT
)
src : 输入图像
dst : 输出图像,和输入图像类型相同
dstsize : 输出图像尺寸,默认为Size((src.cols+1)/2, (src.rows+1)/2),且无论如何设置输出尺寸都必须满足
|dstsize.width*2-src.cols| ≦ 2
|dstsize.height*2-src.rows| ≦ 2
borderType : 边界填充方式
void cv::pyrUp ( InputArray src,
OutputArray dst,
const Size & dstsize = Size(),
int borderType = BORDER_DEFAULT
)
src : 输入图像
dst : 输出图像,和输入图像类型相同
dstsize : 输出图像尺寸,默认为Size((src.cols+1)*2, (src.rows+1)*2),且无论如何设置输出尺寸都必须满足
|dstsize.width-src.cols*2| ≦ (dstsize.width mod 2)
|dstsize.height-src.rows*2| ≦ (dstsize.height mod 2)
borderType : 边界填充方式
总结
可以看出图像降采样后会丢失部分图像信息,上采样的图像和原图比已经产生失真。
对于图像缩放有很多resize()方法和插值方法,图像金字塔主要用于图像的多尺度表示。在图像识别、匹配等方面用的比较多。