图像处理(二):图像金字塔

图像金字塔是图像多尺度表达的一种,是一种以多分辨率来解释图像的有效且概念简单的结构。一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合。

高斯金字塔是常见的图像金字塔,如下所示:

高斯金字塔构造过程如下:

  • 对第i层进行高斯滤波,高斯滤波核如下:

  • 删除滤波后图像的偶数行和偶数列

经过上面两个步骤得到一个原图1/4大的图像,这便完成了一次降采样。通过反复迭代便可以得到一幅图像的金字塔表示。

扫描二维码关注公众号,回复: 8837015 查看本文章

可以经过相反步骤完成上采样得到一幅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()方法和插值方法,图像金字塔主要用于图像的多尺度表示。在图像识别、匹配等方面用的比较多。

发布了87 篇原创文章 · 获赞 108 · 访问量 25万+

猜你喜欢

转载自blog.csdn.net/Dillon2015/article/details/95206420