Opencv中文网

双边滤波(BilateralFilter)

一、什么是双边滤波

双边滤波是一种非线性、保边平滑的图像滤波算法,区别于高斯模糊(只做空间距离加权,会模糊边缘):
它同时考虑两个维度的权重:
空间域权重(位置远近):像素离中心点越近,权重越高(和高斯模糊一致,实现区域平滑)
值域权重(像素灰度 / 颜色差值):像素和中心点颜色越接近,权重越高;边缘处像素差值大,权重极低,边缘不会被模糊
简单总结:平坦区域平滑降噪,边缘区域保留轮廓。

二、OpenCvSharp 方法签名

1. 常用重载方法

csharp

运行

public static void BilateralFilter(
    InputArray src,        // 输入图像:8位单通道/三通道;不能是浮点图
    OutputArray dst,       // 输出图像,尺寸、类型和原图一致
    int d,                 // 滤波时使用的邻域直径
    double sigmaColor,     // 颜色空间滤波器的σ
    double sigmaSpace,     // 坐标空间滤波器的σ
    BorderTypes borderType = BorderTypes.BorderDefault
);

三、参数详细解释

1. int d 邻域直径

  • 滤波窗口的像素直径:
    • d>0:手动指定邻域大小,例如 d=9 代表 9×9 邻域
    • d≤0:程序会根据 sigmaSpace 自动计算窗口大小
  • 经验值:常用 9、11、15;值越大耗时越高,双边滤波本身计算量偏大

2. double sigmaColor 颜色域标准差

控制像素颜色差值对权重的影响:

  • 越大:颜色差异稍大的像素也会参与平滑,画面模糊更强
  • 越小:只有颜色几乎一样的像素才会被平滑,边缘保留更强
  • 经验参考:10~150,人像磨皮常用 50~100

3. double sigmaSpace 空间域标准差

控制像素位置距离对权重的影响:

  • 越大:更远位置的像素参与平滑,模糊范围更大
  • d<=0,窗口直径 = 6 * sigmaSpace
  • 经验参考:10~150

小技巧:一般设置 sigmaColor = sigmaSpace 效果最均衡

4. 边界填充方式 borderType

默认即可,一般不用修改。

四、使用限制(踩坑重点)

  1. 输入图像必须是 CV_8UC1(灰度)或 CV_8UC3(彩色 BGR) 不支持 float、ushort 等类型,浮点图需要先归一化转 8 位才能用。
  2. 耗时远高于高斯模糊、均值滤波 大尺寸 d、大 sigma 下实时视频要谨慎使用,可先缩小图滤波再放大。
  3. 多次连续双边滤波会过度平滑,一般只做 1~2 次。

算法函数:BilateralFilter

定义

void BilateralFilter(Mat src, Mat dst, int d, double sigmaColor, double sigmaSpace);
    /* Cv2.BilateralFilter(
    InputArray src,      // 原图(彩色/灰度都可以)
    OutputArray dst,     // 输出图
    int d,               // 滤波直径(推荐 5~9)
    double sigmaColor,    // 颜色相似度阈值(推荐 75~150)
    double sigmaSpace     // 空间距离阈值(推荐 75~150)

    双边滤波 = 去噪 + 保留边缘(美颜、磨皮、高清去噪神器)
    它是唯一不会把边缘模糊掉的滤波,比高斯模糊高级太多!
);
     */

参数默认 & 范围 & 效果

  • d:滤波直径,默认 9,范围 3~15
  • sigmaColor:颜色阈值,默认 75,50~100
  • sigmaSpace:空间距离阈值,默认 75,50~100特点保边降噪,平滑画面但不糊轮廓。
public override Mat Execute(Mat src)
{
    Mat dst = new Mat();
    Cv2.BilateralFilter(src, dst, D, SigmaColor, SigmaSpace);
    return dst;
}

六、参数调优经验

  1. 轻度降噪(保留细节) d=5,sigmaColor=30,sigmaSpace=30
  2. 人像磨皮(常用) d=9,sigmaColor=75,sigmaSpace=75
  3. 强降噪、轻微糊化 d=15,sigmaColor=120,sigmaSpace=120

七、双边滤波 vs 高斯模糊

表格

滤波方式特点边缘效果耗时适用场景
高斯模糊仅空间加权边缘被模糊通用降噪
双边滤波空间 + 颜色双加权边缘保留人像磨皮、细节降噪、纹理平滑

八、性能优化小技巧

  1. 对高分辨率图像先 Resize 缩小,滤波后再放大
  2. 使用 d=-1 自动根据 sigma 计算窗口,不用手动设大 d
  3. 视频流中尽量降低 d(5/7),不要频繁大参数双边滤波

九、常见报错原因

  1. Unsupported depth of input image:输入不是 8 位图像,先转 ConvertScaleAbs 转 8bit
  2. 画面完全没变化:sigmaColor/sigmaSpace 设置太小,放大参数即可
  3. 程序卡顿:d 设置过大,减小 d 或缩小原图尺寸

copyright @重庆教主 WPF中文网 联系站长:(QQ)23611316 (微信)movieclip (QQ群).NET小白课堂:864486030 | 本文由WPF中文网原创发布,谢绝转载 渝ICP备2023009518号-1