文章目录
- 一、介绍
- 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.运行结果
代码采用了还是采用13 * 13的滤波核,椒盐噪声已经没有了,花朵和绿叶上的纹理和边缘还是很清晰的。其实BilateralFilter()双边滤波最适合的用处是人脸美颜,下面看看美颜的效果:
原创不易,请勿抄袭。共同进步,相互学习。