一、什么是双边滤波
双边滤波是一种非线性、保边平滑的图像滤波算法,区别于高斯模糊(只做空间距离加权,会模糊边缘):
它同时考虑两个维度的权重:
空间域权重(位置远近):像素离中心点越近,权重越高(和高斯模糊一致,实现区域平滑)
值域权重(像素灰度 / 颜色差值):像素和中心点颜色越接近,权重越高;边缘处像素差值大,权重极低,边缘不会被模糊
简单总结:平坦区域平滑降噪,边缘区域保留轮廓。
二、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
默认即可,一般不用修改。
四、使用限制(踩坑重点)
- 输入图像必须是
CV_8UC1(灰度)或CV_8UC3(彩色 BGR) 不支持float、ushort等类型,浮点图需要先归一化转 8 位才能用。 - 耗时远高于高斯模糊、均值滤波 大尺寸 d、大 sigma 下实时视频要谨慎使用,可先缩小图滤波再放大。
- 多次连续双边滤波会过度平滑,一般只做 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;
}
六、参数调优经验
- 轻度降噪(保留细节)
d=5,sigmaColor=30,sigmaSpace=30 - 人像磨皮(常用)
d=9,sigmaColor=75,sigmaSpace=75 - 强降噪、轻微糊化
d=15,sigmaColor=120,sigmaSpace=120
七、双边滤波 vs 高斯模糊
表格
| 滤波方式 | 特点 | 边缘效果 | 耗时 | 适用场景 |
|---|---|---|---|---|
| 高斯模糊 | 仅空间加权 | 边缘被模糊 | 低 | 通用降噪 |
| 双边滤波 | 空间 + 颜色双加权 | 边缘保留 | 高 | 人像磨皮、细节降噪、纹理平滑 |
八、性能优化小技巧
- 对高分辨率图像先
Resize缩小,滤波后再放大 - 使用
d=-1自动根据 sigma 计算窗口,不用手动设大 d - 视频流中尽量降低 d(5/7),不要频繁大参数双边滤波
九、常见报错原因
Unsupported depth of input image:输入不是 8 位图像,先转ConvertScaleAbs转 8bit- 画面完全没变化:
sigmaColor/sigmaSpace设置太小,放大参数即可 - 程序卡顿:d 设置过大,减小 d 或缩小原图尺寸
若文章对您有帮助,可以激励一下我哦,祝您平安幸福!
| 微信 | 支付宝 |
|---|---|
![]() |
![]() |

