OpenCV每日函数 图像过滤模块 (4) buildPyramid函数

一、概述

        图像金字塔表示,是由计算机视觉、图像处理和信号处理社区开发的一种多尺度 信号 表示,其中信号或图像经过反复平滑和二次采样。金字塔表示是尺度空间表示和多分辨率分析的前身。

          buildPyramid函数为图像构造高斯金字塔。该函数构造一个图像向量,并通过递归地将 pyrDown 应用于先前构建的金字塔层来构建高斯金字塔,从 dst[0]==src 开始。

        在高斯金字塔中,后续图像使用高斯平均值(高斯模糊)加权并按比例缩小。每个包含局部平均值的像素对应于金字塔较低级别的邻域像素。这种技术特别用于纹理合成。

拉普拉斯金字塔与高斯金字塔非常相似,但保存了每个级别之间模糊版本的差异图像。只有最小级别不是差异图像,才能使用更高级别的差异图像重建高分辨率图像。这种技术可用于图像压缩。

二、buildPyramid函数

1、函数原型

cv::buildPyramid (InputArray src, OutputArrayOfArrays dst, int maxlevel, int borderType=BORDER_DEFAULT)

2、参数详解 

src 源图像。 检查 pyrDown 以获取支持的类型列表。
dst 与 src 相同类型的 maxlevel+1 图像的目标向量。 dst[0] 将与 src 相同。 dst[1] 是下一个金字塔层,一个平滑和缩小的 src,以此类推。
maxlevel 最后一个(最小的)金字塔层的从 0 开始的索引。 它必须是非负数。
borderType 像素外推法,请参阅 BorderTypes(不支持 BORDER_CONSTANT)

三、OpenCV源码 

1、源码路径

opencv\modules\imgproc\src\pyramids.cpp

2、源码代码

void cv::buildPyramid( InputArray _src, OutputArrayOfArrays _dst, int maxlevel, int borderType )
{
    CV_INSTRUMENT_REGION();

    CV_Assert(borderType != BORDER_CONSTANT);

    if (_src.dims() <= 2 && _dst.isUMatVector())
    {
        UMat src = _src.getUMat();
        _dst.create( maxlevel + 1, 1, 0 );
        _dst.getUMatRef(0) = src;
        for( int i = 1; i <= maxlevel; i++ )
            pyrDown( _dst.getUMatRef(i-1), _dst.getUMatRef(i), Size(), borderType );
        return;
    }

    Mat src = _src.getMat();
    _dst.create( maxlevel + 1, 1, 0 );
    _dst.getMatRef(0) = src;

    int i=1;

    CV_IPP_RUN(((IPP_VERSION_X100 >= 810) && ((borderType & ~BORDER_ISOLATED) == BORDER_DEFAULT && (!_src.isSubmatrix() || ((borderType & BORDER_ISOLATED) != 0)))),
        ipp_buildpyramid( _src,  _dst,  maxlevel,  borderType));

    for( ; i <= maxlevel; i++ )
        pyrDown( _dst.getMatRef(i-1), _dst.getMatRef(i), Size(), borderType );
}

四、效果图像示例

512*512

256*256

128*128

猜你喜欢

转载自blog.csdn.net/bashendixie5/article/details/125236367
今日推荐