OpenCV学习笔记(六):非线性滤波-中值、双边:medianBlur(),bilateralFilter()

OpenCV学习笔记(六):非线性滤波-中值、双边:medianBlur(),bilateralFilter()

1、中值滤波(Median filter)
是一种典型的非线性滤波技术,基本思想是用像素点邻域灰度值的中值来代替该像素点的灰度值,该方法在去除脉冲噪声、斑点噪声(speckle noise)和椒盐噪声(salt-and-pepper noise)的同时又能保留图像边缘细节。
优点:
中值滤波在一定的条件下可以克服常见线性滤波器带来的图像细节模糊,而且对
滤除脉冲干扰及图像扫描噪声
非常有效,也常用于保护边缘信息, 保存边缘的特性使它在不希望出现边缘模糊的场合也很有用,是非常经典的平滑噪声处理方法。
缺点:
1)中值滤波花费的时间是均值滤波的5倍以上
2)对一些细节多,特别是线、尖顶等细节多的图像不宜采用

2、双边滤波(Bilateral filter)
是结合图像的空间邻近度和像素值相似度的一种折衷处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的。具有简单、非迭代、局部的特点。
优点:
双边滤波器的好处是可以做边缘保存(edge preserving),双边滤波器顾名思义比高斯滤波多了一个高斯方差sigma-d,它是基于空间分布的高斯滤波函数,所以在边缘附近,离的较远的像素不会太多影响到边缘上的像素值,这样就保证了边缘附近像素值的保存。
缺点:
但是由于保存了过多的高频信息,对于彩色图像里的高频噪声,双边滤波器不能够干净的滤掉,只能够对于低频信息进行较好的滤波。
在双边滤波器中,输出像素的值依赖于邻域像素值的加权值组合,而加权系数w(i,j,k,l)取决于定义域核和值域核的乘积。

代码示例:

#include <opencv2/opencv.hpp>

Mat g_srcImage,g_dstImage1,g_dstImage2,g_dstImage3;	//存储图片的Mat类型

int g_nMedianBlurValue=10;					//中值滤波参数值
int g_nBilateralFilterValue=30;             //双边滤波参数值


using namespace cv;
using namespace std;

int main(int argc, char *argv[])
{
    // 载入原图
    g_srcImage = imread( "F:/C++/2. OPENCV 3.1.0/TEST/7.jpg", 1 );
    if( !g_srcImage.data )
        { printf("Oh,no,读取srcImage错误~! \n"); return false; }

    //克隆原图到三个Mat类型中
    g_dstImage1 = g_srcImage.clone( );
    g_dstImage2 = g_srcImage.clone( );

    //显示原图
    imshow("【<0>原图窗口】",g_srcImage);

    // 1、中值滤波
    namedWindow("【<4>中值滤波】", 1);
    createTrackbar("参数值:", "【<4>中值滤波】",&g_nMedianBlurValue, 50,on_MedianBlur );
    on_MedianBlur(g_nMedianBlurValue,0);

    // 2、双边滤波
    namedWindow("【<5>双边滤波】", 1);
    createTrackbar("参数值:", "【<5>双边滤波】",&g_nBilateralFilterValue, 50,on_BilateralFilter);
    on_BilateralFilter(g_nBilateralFilterValue,0);

    //输出一些帮助信息
    cout<<endl<<"\t运行成功,请调整滚动条观察图像效果~\n\n"
        <<"\t按下“q”键时,程序退出。\n";

    //按下“q”键时,程序退出
    while(char(waitKey(1)) != 'q') {}
	return 0
}
// 1、中值滤波操作的回调函数
static void on_MedianBlur(int, void *)
{
    medianBlur ( g_srcImage, g_dstImage1, g_nMedianBlurValue*2+1 );
    imshow("【<4>中值滤波】", g_dstImage1);
}

// 2、双边滤波操作的回调函数
static void on_BilateralFilter(int, void *)
{
    bilateralFilter ( g_srcImage, g_dstImage2, g_nBilateralFilterValue, g_nBilateralFilterValue*2, g_nBilateralFilterValue/2 );
    imshow("【<5>双边滤波】", g_dstImage2);
}

结果:
OpenCV学习笔记(六):非线性滤波-中值、双边:medianBlur(),bilateralFilter()_第1张图片
OpenCV学习笔记(六):非线性滤波-中值、双边:medianBlur(),bilateralFilter()_第2张图片
OpenCV学习笔记(六):非线性滤波-中值、双边:medianBlur(),bilateralFilter()_第3张图片
参考:【OpenCV入门教程之九】 非线性滤波专场:中值滤波、双边滤波

你可能感兴趣的:(OpenCV)