在opencv中图像有时候过大导致进行操作时候信息量过大,耗时较长,一般可以将图像压缩,然后根据进行初步信息搜索,减少搜索范围,然后定位可能搜索区域进行再次分析。opencv有对图像进行放大(向上采样)和缩小(向下采样)两个函数PyrUp()和PyrDown(),可以直接操作。当然放大与缩小图像也有resize()函数,不过resize()的实现方式主要是各种插值法,而PyrUp和PyrDown用了很多卷积和权值相关的算法。
高斯金字塔:向下降采样图像
拉普拉斯金字塔:从低层图像中向上采样重建图像。
具体的过程,我们可以这么描述下:
高斯金字塔:金字塔从i层生成第i+1层,我们要先用高斯核对Gi进行卷积,然后,删除所有偶数行和偶数列。这样,新得到的图像面积会变为源图像的四分之一。循环上述过程,即可产生整个金字塔。
拉普拉斯金字塔:图像首先在每个维度上扩大为原来的两倍,新增的行以0填充,然后给指定的滤波器进行卷积(实际上是一个在每一维上都扩大为2倍的过滤器)去估计“丢失”像素的近似值。得到后的图像与原来的图像相比较会发觉比较模糊,丢失了一些信息。为了恢复出原来的图像,我们需要获得这些丢失的信息,这些信息就构成了拉普拉斯金字塔。
具体这三个函数算法可以查相关资料,一下代码示例:
void PyrUpAndPyrDown()//图像金字塔放缩
{
Mat srcImg = imread("D:/ImageTest/m.jpg"); //读取图片
Mat dst1,dst2,dst3;
imshow("img", srcImg); //显示图片
pyrUp(srcImg, dst1,Size(srcImg.cols*2,srcImg.rows*2));//放大为原来的两倍
pyrDown(srcImg, dst2,Size(srcImg.cols/2,srcImg.rows/2));//缩小为原来的一半
resize(srcImg,dst3,Size(),0.5,0.5);//将原图像宽高缩放为0.5.
// resize(srcImg,dstImg,Size(srcImg.cols/2,srcImg.rows/2),0,0);//同样将图像缩小为0.5
//dsize和fx、fy不能同时为0。fx、fy是沿x轴和y轴的缩放系数;
//@param dsize output image size; if it equals zero, it is computed as:
//\f[\texttt{dsize = Size(round(fx*src.cols), round(fy*src.rows))}\f]
// CV_EXPORTS_W void resize( InputArray src, OutputArray dst,
// Size dsize, double fx = 0, double fy = 0,
// int interpolation = INTER_LINEAR );
// INTER_NEAREST - 最近邻插值
// INTER_LINEAR - 线性插值(默认)
// INTER_AREA - 区域插值
// INTER_CUBIC - 三次样条插值
// INTER_LANCZOS4 - Lanczos插值
imshow("imgUp", dst1); //显示图片
imshow("imgDown", dst2); //显示图片
imshow("imgResize", dst3); //显示图片
waitKey(0); //暂停按键等待
}
效果如下: