Opencv2.4学习::滤波(4)双边滤波

滤波系列:

  1. 均值滤波

  2. 中值滤波
  3. 高斯滤波
  4. 双边滤波

 双边滤波

给出一张双边滤波过程图结合理解:

  • 双边滤波,通俗来说就是根据(1)当前像素和领域像素的距离分配权重(2)当前像素和领域像素值大小分配权重
  • 可滤低频分量(上图中两个阶梯平面的毛刺),对高频分量(阶梯垂直高度)不敏感
  • 因此可作为保留边缘、滤低频噪声

 核心函数:

C++: void bilateralFilter(InputArray src, OutputArray dst, int d, double sigmaColor, double sigmaSpace, int borderType=BORDER_DEFAULT )
  • InputArray src: 输入图像,可以是Mat类型,图像必须是8位或浮点型单通道、三通道的图像。 
  • OutputArray dst: 输出图像,和原图像有相同的尺寸和类型。 
  • int d: 表示在过滤过程中每个像素邻域的直径范围。如果这个值是非正数,则函数会从第五个参数sigmaSpace计算该值。 
  • double sigmaColor: 颜色空间过滤器的sigma值,这个参数的值越大,表明该像素邻域内有越宽广的颜色会被混合到一起,产生较大的半相等颜色区域。 (该参数值越大,处理时间越长)
  • double sigmaSpace: 坐标空间中滤波器的sigma值,如果该值较大,则意味着颜色相近的较远的像素将相互影响,从而使更大的区域中足够相似的颜色获取相同的颜色。当d>0时,d指定了邻域大小且与sigmaSpace五官,否则d正比于sigmaSpace. 
  • int borderType=BORDER_DEFAULT: 用于推断图像外部像素的某种边界模式,有默认值BORDER_DEFAULT.

调用代码:

#include<opencv2/core/core.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<iostream>
using namespace std;
using namespace cv;
void main()
{
	Mat srcImage = imread("F:\\opencv_re_learn\\2.jpg");
	if (!srcImage.data){
		cout << "falied to read" << endl;
		system("pause");
		return;
	}
	imshow("srcImage", srcImage);
	Mat blurImage;
	bilateralFilter(srcImage, blurImage, 10, 80, 50);
	imshow("bilateralFilter", blurImage);
	waitKey(0);
}

实现效果:

由效果可以看出,双边滤波有 模糊细节,保留主体边缘的效果。 

猜你喜欢

转载自blog.csdn.net/dieju8330/article/details/82744895