一、概述
对图像进行上采样,然后对其进行模糊处理。默认情况下,输出图像的大小计算为 Size(src.cols\*2, (src.rows\*2),但无论如何,应满足以下条件:
该函数执行高斯金字塔构造的上采样步骤,尽管它实际上可以用于构造拉普拉斯金字塔。 首先,它通过注入甚至零行和列来对源图像进行上采样,然后将结果与 pyrDown 中相同的内核乘以 4 进行卷积。
高斯金字塔中的较高级别(低分辨率)是通过删除较低级别(较高分辨率)图像中的连续行和列而形成的。然后,较高级别的每个像素由具有高斯权重的底层 5 个像素的贡献形成。通过这样做,图像变成
图像。所以面积减少到原来面积的四分之一。它被称为八度。随着我们在金字塔的上层(即分辨率降低),相同的模式继续存在。同样,在扩展时,每个级别的面积变成 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]))
