【opencv学习之四十四】图像放缩与金字塔

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/abcvincent/article/details/82558303

在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); //暂停按键等待
}

效果如下:

猜你喜欢

转载自blog.csdn.net/abcvincent/article/details/82558303