【Emgu CV教程】6.8、图像平滑之BilateralFilter()双边滤波

文章目录

  • 一、介绍
    • 1.原理
    • 2.函数介绍
  • 二、举例
    • 1.原始素材
    • 2.代码
    • 3.运行结果


一、介绍

1.原理

BilateralFilter()双边滤波也是非线性滤波,之前介绍的滤波只考虑空间信息(滤波核或邻域),容易造成边缘模糊和细节丢失,相比来说双边滤波在计算某一个像素点的新值时,不仅考虑距离信息(距离越远,权重越小),还考虑色彩信息(色彩差别越大,权重越小)。

1、距离目标像素点越远,权重越小;距离目标像素点越近,权重越大。
2、与目标像素点值越远,权重值越小;与目标像素点值相近,权重值越大

由于双边滤波同时考虑距离和色彩,因此它在去除噪声同时,又能够较好地保护边缘信息。函数的具体数学原理和计算过程,读者们自己百度一下,下面只给出具体用法。

2.函数介绍

官方定义如下:

public static void BilateralFilter(
	IInputArray src,  // 输入图像
	IOutputArray dst, // 输出图像
	int d, // 滤波核的大小,也就是选取的邻域像素的高度和宽度。
	double sigmaColor, // 滤波核在颜色空间的方差,值越大就说明周围有越多的像素点可以参与到运算中。该值为0时,滤波失去意义;该值为255时,滤波核内的所有点都能够参与运算。
	double sigmaSpace, // 滤波核在距离空间的方差,值越大,意味着更远的像素影响越大。
	BorderType borderType = BorderType.Reflect101 // 边界样式,一般选默认。
)

二、举例

1.原始素材

原始素材定义为srcMat,如下:
在这里插入图片描述
还是这个有椒盐噪声的向日葵图片。

2.代码

Emgu CV双边滤波代码如下:

Mat tempMat = srcMat.Clone();
Mat dstMat = new Mat();
int d = 13;
double sigmaColor = 250.0;
double sigmaSpace = 20.5;
CvInvoke.BilateralFilter(tempMat, dstMat, d, sigmaColor, sigmaSpace);
CvInvoke.Imshow("BilateralFilter image, " + dstMat.Size.ToString(), dstMat);

3.运行结果

【Emgu CV教程】6.8、图像平滑之BilateralFilter()双边滤波_第1张图片
代码采用了还是采用13 * 13的滤波核,椒盐噪声已经没有了,花朵和绿叶上的纹理和边缘还是很清晰的。其实BilateralFilter()双边滤波最适合的用处是人脸美颜,下面看看美颜的效果:
【Emgu CV教程】6.8、图像平滑之BilateralFilter()双边滤波_第2张图片


原创不易,请勿抄袭。共同进步,相互学习。

你可能感兴趣的:(Emgu,CV使用教程,c#,Emgu,CV,图像处理,图像分析,计算机视觉)