图像处理(1):
线性滤波(3):线性滤波相关OpenCV源码剖析
一,OpenCV中GaussianBlur函数源码剖析;
二,线性滤波核心API函数(1.方框滤波:boxFilter函数;2. 均值滤波:blur函数;3.高斯滤波:GaussianBlur函数);
一,OpenCV中GaussianBlur函数源码剖析
下面我们看一下OpenCV 中 GaussianBlur函数源代码:
//-----------------------------------【GaussianBlur()函数中文注释版源代码】-----------------------
// 代码作用:封装高斯滤波的GaussianBlur()函数
// 说明:以下代码为来自于计算机开源视觉库OpenCV的官方源代码
// OpenCV源代码版本:2.4.8
// 源码路径:…\opencv\sources\modules\imgproc\src\smooth.cpp
// 源文件中如下代码的起始行数:832行
// 中文注释by浅墨
//--------------------------------------------------------------------------------------------------------
void cv::GaussianBlur( InputArray _src,OutputArray _dst, Size ksize,
double sigma1, doublesigma2,
int borderType )
{
//拷贝形参Mat数据到临时变量,用于稍后的操作
Mat src = _src.getMat();
_dst.create( src.size(), src.type() );
Mat dst =_dst.getMat();
//处理边界选项不为BORDER_CONSTANT时的情况
if( borderType != BORDER_CONSTANT )
{
if( src.rows == 1 )
ksize.height = 1;
if( src.cols == 1 )
ksize.width = 1;
}
//若ksize长宽都为1,将源图拷贝给目标图
if( ksize.width == 1 && ksize.height == 1 )
{
src.copyTo(dst);
return;
}
//若之前有过HAVE_TEGRA_OPTIMIZATION优化选项的定义,则执行宏体中的tegra优化版函数并返回
#ifdef HAVE_TEGRA_OPTIMIZATION
if(sigma1 == 0 && sigma2 == 0 && tegra::gaussian(src,dst, ksize, borderType))
return;
#endif
//如果HAVE_IPP&& (IPP_VERSION_MAJOR >= 7为真,则执行宏体中语句
#if defined HAVE_IPP &&(IPP_VERSION_MAJOR >= 7)
if(src.type() == CV_32FC1 && sigma1 == sigma2 &&ksize.width == ksize.height && sigma1 != 0.0 )
{
IppiSize roi = {src.cols, src.rows};
int bufSize = 0;
ippiFilterGaussGetBufferSize_32f_C1R(roi, ksize.width, &bufSize);
AutoBuffer<uchar> buf(bufSize+128);
if( ippiFilterGau