opencv(4)图像滤波

都是一些常用函数,但是可能太常用了,里面的一些关键点,没做过多的研究,今天主要对函数中特殊的地方做出分析

1.cvSmooth  图像滤波

CV_BLUR_NO_SCALE (简单不带尺度变换的模糊) - 对每个象素的 param1×param2 领域求和。如果邻域大小是变化的,可以事先利用函数 cvIntegral 计算积分图像。 
CV_BLUR (simple blur) - 对每个象素param1×param2邻域 求和并做尺度变换 1/(param1?param2). 
CV_GAUSSIAN (gaussian blur) - 对图像进行核大小为 param1×param2 的高斯卷积 
CV_MEDIAN (median blur) - 对图像进行核大小为param1×param1 的中值滤波 (i.e. 邻域是方的). 
CV_BILATERAL (双向滤波) - 应用双向 3x3 滤波,彩色 sigma=param1,空间 sigma=param2. 关于双向滤波,可参考 http://www.dai.ed.ac.uk/CVonline/LOCAL_COPIES/MANDUCHI1/Bilateral_Filtering.html 

(1)高斯滤波是利用高斯函数来进行图像滤波的一种方法,关于其原理可以参考网页:高斯滤波器 ,里面对高斯滤波器的参数做了说明,opencv中,核的大小通过param1*param2来定义(如果param2<=0,param2=param1),param3(X方向)和param4(Y方向)定义了高斯卷积核的尺寸,如果采用默认,高斯核将根据param1*param2来定义,关系如下:

 
param3 param4决定了图像滤波的平滑程度,可以参考高斯滤波器 ,在同样标准差的情况下,尺寸越大,图像的平滑程度越好,也越模糊(全局性的),同样,同样尺寸的情况,标准差越大,图像也越模糊(局部性的),提供几张图像做参考,是对拍摄的静脉图像做滤波,里面的噪声比较大,很明显可以看出差异:


 

(2)双边滤波能够很好的保留边缘信息,提供比高斯滤波更好的边缘保留特性,opencv提供的双线性滤波器的加权计算包含2个部分,一部分叫做space-related bilateral filter coefficients空域参数,一个是 color-related bilateral filter coefficients颜色域参数,空域参数采用高斯核来计算,颜色域参数是基于像素与中心像素的亮度差的差值的加权,相似的像素赋给较大的权值,不相似的赋予较小的权值,处理完的图像更像一个水彩画,可用于图像分割。算法的原理可以参考网页:原理,从频域看下图可以看得很明白

opencv的文档对双边滤波说明(彩色 sigma=param1,空间 sigma=param2)是有错误的,实际上param1表示核宽度/2,param2没有使用,param3表示色彩域内高斯核的宽度,param4表示空间域的高斯核宽度。opencv的源码如下:

View Code
//cvsmooth函数
cvSmooth( const void* srcarr, void* dstarr, int smooth_type,
          int param1, int param2, double param3, double param4 )
{
    ...

    if( smooth_type == CV_BLUR || smooth_type == CV_BLUR_NO_SCALE )
         ...
    else if( smooth_type == CV_GAUSSIAN )
        ...
    else if( smooth_type == CV_MEDIAN )
       ...
    else
        cv::bilateralFilter( src, dst, param1, param3, param4, cv::BORDER_REPLICATE );
}

//双边滤波函数,可以很明白的看清楚参数传递过程了
void bilateralFilter( const Mat& src, Mat& dst, int d,
                      double sigmaColor, double sigmaSpace,
                      int borderType )
{
    dst.create( src.size(), src.type() );
    if( src.depth() == CV_8U )
        bilateralFilter_8u( src, dst, d, sigmaColor, sigmaSpace, borderType );
    else if( src.depth() == CV_32F )
        bilateralFilter_32f( src, dst, d, sigmaColor, sigmaSpace, borderType );
    else
        CV_Error( CV_StsUnsupportedFormat,
        "Bilateral filtering is only implemented for 8u and 32f images" );
}

//bilateralFilter函数部分

下面几张图是我处理结果与高斯的对比:

效果不是很明显,可以看一下别的网站的几张图片

作者:细雨淅淅

转载请注明地址:http://www.cnblogs.com/zsb517/archive/2012/06/06/2538891.html

原文地址:https://www.cnblogs.com/zsb517/p/2538891.html