滤波系列:
双边滤波
给出一张双边滤波过程图结合理解:
- 双边滤波,通俗来说就是根据(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);
}
实现效果:
由效果可以看出,双边滤波有 模糊细节,保留主体边缘的效果。