图像金字塔【OpenCv】

  • 内容
  • 相关

    在某些情况下,仅使用固定大小的图像工作是不可能的,可能需要不同分辨率的原始图像。例如,在对象检测问题中,通过检测整幅图像去试图找到对象那就太浪费时间了。在这种情况下,从较小分辨率的一些图像开始进行对象搜索会更为有效。这种类型的图像集合被形象的称之为金字塔或多级纹理。有两种类型的图像金字塔:高斯(Gaussian)金字塔和拉普拉斯(Laplacian)金字塔。

一、高斯金字塔

    高斯金字塔的创建方式如下:在更低的一层通过交替的隔行和隔列删除像素,然后通过对底层领域进行高斯滤波来获得更高一层的像素值。像这样每执行完金字塔的一个步骤之后,图像的宽和高减少为原来的1/2,其面积减少为上一层图像面积的1/4。在OpenCv中,可以使用函数pyrDown、pyrUpbuildPyramid计算高斯金字塔。
    (1) void 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)计算。
    (2) void pyrUp(InputArray src,OutputArray dst,const Size& dstsize=Size(),int borderType=BORDER_DEFAULT):该函数计算与函数pryDown相反的过程。
    (3) void buildPyramid(InputArray src,OutputArray dst,int maxlevel,int borderType=BORDER_DEFAULT):该函数为存储在src中的图像建立一个高斯金字塔,获得maclevel幅新图像,并将其存储在dst数组中,其原始图像存储在dst[0]中。因此,结果是在dst中存储了maclevel+1幅图像。
    金字塔还可以用于分割。OpenCV提供了一个基于均值漂移分割算法的第一步来计算均值漂移金字塔的函数:
    void pyrMeanShiftFiltering(InputArray src,OutputArray dst,double sp,double sr,int maxLevel=1,TermCriteria termcrit=TermCriteria(TermCriteria::MAX_ITER+TermCriteria::EPS,5,1)):该函数实现了均值漂移分割的滤波阶段,获取一幅具有颜色梯度和细粒度纹理平滑的图像dst。参数sp和sr表示空间窗口和颜色窗口半径。

二、拉普拉斯金字塔

    在OpenCV中,虽然对拉普拉斯金字塔没有特定的函数来实现,但是拉普拉斯金字塔可由高斯金字塔形成。拉普拉斯金字塔可以看出是大部分元素为0的一些边界图像,拉普拉斯金字塔的第i层是高斯金字塔中第i层与高斯金字塔中第i+1层的膨胀版本之间的差。

    下面的代码示例展示了如何通过函数pyrDown获取一个高斯金字塔的两层,并通过函数pyrUp进行反向操作。使用pyrUp之后不能获取原始图像。

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
int main()
{
    Mat src;
    src = imread("D:/OpenCv/lemon4.jpg");
    Mat dst,dst2;
    pyrDown(src,dst);
    pyrDown(dst,dst2);
    namedWindow(" ORIGINAL ",WINDOW_AUTOSIZE);
    imshow(" ORIGINAL ",src);
    namedWindow(" 1st PYRDOWN ",WINDOW_AUTOSIZE);
    imshow(" 1st PYRDOWN ",dst);
    namedWindow(" 2st PYRDOWN ",WINDOW_AUTOSIZE);
    imshow(" 2st PYRDOWN ",dst2);
    pyrUp(dst2,dst);
    pyrUp(dst,src);
    namedWindow(" NEW ORIGINAL ",WINDOW_AUTOSIZE);
    imshow(" NEW ORIGINAL ",src);
    namedWindow(" 1st PYRUP ",WINDOW_AUTOSIZE);
    imshow(" 1st PYRUP ",dst);
    namedWindow(" 2st PYRUP ",WINDOW_AUTOSIZE);
    imshow(" 2st PYRUP ",dst2);
    waitKey();
}

代码输出如下:

图像金字塔.png

本文标签:

版权声明:若无特殊注明,本文皆为《尤尤》原创,转载请保留文章出处。

本文链接:图像金字塔【OpenCv】 - https://www.yxfseo.cn/post-119.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注