OpenCV每日函数 图像过滤模块 (18) pyrUp函数

一、概述

        对图像进行上采样,然后对其进行模糊处理。默认情况下,输出图像的大小计算为 Size(src.cols\*2, (src.rows\*2),但无论如何,应满足以下条件:

        该函数执行高斯金字塔构造的上采样步骤,尽管它实际上可以用于构造拉普拉斯金字塔。 首先,它通过注入甚至零行和列来对源图像进行上采样,然后将结果与 pyrDown 中相同的内核乘以 4 进行卷积。

        高斯金字塔中的较高级别(低分辨率)是通过删除较低级别(较高分辨率)图像中的连续行和列而形成的。然后,较高级别的每个像素由具有高斯权重的底层 5 个像素的贡献形成。通过这样做,M\times N图像变成M/2 \times N/2图像。所以面积减少到原来面积的四分之一。它被称为八度。随着我们在金字塔的上层(即分辨率降低),相同的模式继续存在。同样,在扩展时,每个级别的面积变成 4 倍。我们可以使用cv2.pyrDown()cv2.pyrUp()函数找到高斯金字塔。

二、pyrUp函数

1、函数原型

cv::pyrUp (InputArray src, OutputArray dst, const Size &dstsize=Size(), int borderType=BORDER_DEFAULT)

2、参数详解

src 输入图像。
dst 输出图像。 它具有指定的大小和与 src 相同的类型。
dstsize 输出图像的大小。
borderType 像素外推方法,请参阅 BorderTypes(仅支持 BORDER_DEFAULT)

三、OpenCV源码

1、源码路径

opencv\modules\imgproc\src\pyramids.cpp

2、源码代码

void cv::pyrUp( InputArray _src, OutputArray _dst, const Size& _dsz, int borderType )
{
    CV_INSTRUMENT_REGION();

    CV_Assert(borderType == BORDER_DEFAULT);

    CV_OCL_RUN(_src.dims() <= 2 && _dst.isUMat(),
               ocl_pyrUp(_src, _dst, _dsz, borderType))


    Mat src = _src.getMat();
    Size dsz = _dsz.empty() ? Size(src.cols*2, src.rows*2) : _dsz;
    _dst.create( dsz, src.type() );
    Mat dst = _dst.getMat();
    int depth = src.depth();

#ifdef HAVE_IPP
    bool isolated = (borderType & BORDER_ISOLATED) != 0;
    int borderTypeNI = borderType & ~BORDER_ISOLATED;
#endif
    CV_IPP_RUN(borderTypeNI == BORDER_DEFAULT && (!_src.isSubmatrix() || isolated) && dsz == Size(_src.cols()*2, _src.rows()*2),
        ipp_pyrup( _src,  _dst,  _dsz,  borderType));


    PyrFunc func = 0;
    if( depth == CV_8U )
        func = pyrUp_< FixPtCast<uchar, 6> >;
    else if( depth == CV_16S )
        func = pyrUp_< FixPtCast<short, 6> >;
    else if( depth == CV_16U )
        func = pyrUp_< FixPtCast<ushort, 6> >;
    else if( depth == CV_32F )
        func = pyrUp_< FltCast<float, 6> >;
    else if( depth == CV_64F )
        func = pyrUp_< FltCast<double, 6> >;
    else
        CV_Error( CV_StsUnsupportedFormat, "" );

    func( src, dst, borderType );
}

四、效果图像示例

        下面的例子采用python代码,进行了连续3次进行pyrUp,得到三张新的图片,对应了金字塔中的三个级别,们可以使用cv2.pyrDown()cv2.pyrUp()函数得到高斯金字塔。

img = cv2.imread('..\\messi5.jpg')
img = cv2.resize(img,None,fx=0.15,fy=0.15)#为了观察方便缩小原图
img_up = cv2.pyrUp(img,dstsize=(2*img.shape[1],2*img.shape[0]))
img_up2 = cv2.pyrUp(img_up,dstsize=(2*img_up.shape[1],2*img_up.shape[0]))
img_up3 = cv2.pyrUp(img_up2,dstsize=(2*img_up2.shape[1],2*img_up2.shape[0]))
采样三次

猜你喜欢

转载自blog.csdn.net/bashendixie5/article/details/125256918