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