开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第18天
1 双边滤波
双边滤波(Bilateral filter)是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折中处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的,具有简单、非迭代、局部的特点。
双边滤波器的好处是可以做边缘保存(edge preserving)。以往常用维纳滤波或者高斯滤波去降噪,但二者都会较明显地模糊边缘,对于高频细节的保护效果并不明显。双边滤波器顾名思义,比高斯滤波多了一个高斯方差sigma—d,它是基于空间分布的高斯滤波函数,所以在边缘附近,离得较远的像素不会对边缘上的像素值影响太多,这样就保证了边缘附近像素值的保存。但是,由于保存了过多的高频信息,对于彩色图像里的高频噪声,双边滤波器不能够干净地滤掉,只能对于低频信息进行较好地滤波。
在双边滤波器中,输出像素的值依赖于邻域像素值的加权值组合,公式如下。
而加权系数w(i,j,k,1)取决于定义域核和值域核的乘积。
其中定义域核表示如下。
值域核表示如下。
定义域滤波和值域滤波如下图所示。
两者相乘后,就会产生依赖于数据的双边滤波权重函数,如下。
2 示例
代码:
//-----------------------------------【头文件包含部分】---------------------------------------
// 描述:包含程序所依赖的头文件
//-------------------------------------------------------------------------------------------
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
//-----------------------------------【命名空间声明部分】---------------------------------------
// 描述:包含程序所使用的命名空间
//--------------------------------------------------------------------------------------------
using namespace cv;
//-----------------------------------【main( )函数】--------------------------------------------
// 描述:控制台应用程序的入口函数,我们的程序从这里开始
//---------------------------------------------------------------------------------------------
int main( )
{
// 载入原图
Mat image=imread("1.jpg");
//创建窗口
namedWindow( "双边滤波【原图】" );
namedWindow( "双边滤波【效果图】");
//显示原图
imshow( "双边滤波【原图】", image );
//进行双边滤波操作
Mat out;
bilateralFilter ( image, out, 25, 25*2, 25/2 );
//显示效果图
imshow( "双边滤波【效果图】" ,out );
waitKey( 0 );
}
效果图: