cv::edgePreservingFilter 是 OpenCV 里一个在平滑图像的同时尽量保持边缘的滤波器,常用于去噪、HDR / tone-mapping 预处理、以及需要"磨皮但不糊边"的场景。
1️⃣ 基本说明
函数原型(C++)
void cv::edgePreservingFilter( InputArray src, OutputArray dst, int flags = 1, float sigma_s = 60, float sigma_r = 0.4f );
Python
cv2.edgePreservingFilter(src, dst, flags=1, sigma_s=60, sigma_r=0.4)
2️⃣ 参数含义(重点)
🔹 flags(滤波类型)
| flags | 模式 | 说明 |
|---|---|---|
cv::RECURS_FILTER (1) |
递归滤波 | 更快,适合实时 |
cv::NORMCONV_FILTER (2) |
归一化卷积 | 质量更高,速度慢 |
一般建议:
-
实时 / 大图像 :
RECURS_FILTER -
离线 / 高质量 :
NORMCONV_FILTER
🔹 sigma_s(空间尺度)
-
控制平滑范围(空间距离)
-
值越大 → 平滑区域越大
典型范围:
20 ~ 200
🔹 sigma_r(颜色/强度相似性)
-
控制边缘保留强度
-
值越小 → 越保护边缘
-
值越大 → 越像普通模糊
典型范围:
0.1 ~ 1.0
4️⃣ 和其他滤波的区别(你做光学/测量时很关键)
| 方法 | 特点 |
|---|---|
GaussianBlur |
快,但糊边 |
medianBlur |
去椒盐噪声强 |
bilateralFilter |
边缘保持好,但慢 |
edgePreservingFilter |
双边 + 优化版,速度和效果平衡 |
guidedFilter |
结构保持最好(ximgproc) |
实际上
edgePreservingFilter ≈ 快速双边滤波 + 边缘感知权重❌ 会改变局部亮度统计
不适合直接用于:
亮度均匀性定量分析
MTF / PSF 原始数据
✔ 适合:
缺陷检测前预处理
边缘定位前降噪
坏点 / 亮斑区域平滑
6️⃣ 实测参数推荐(偏工业图像)
| 场景 | sigma_s | sigma_r |
|---|---|---|
| 亮斑 / flare 预处理 | 50--100 | 0.2--0.4 |
| 显示面亮度图 | 80--150 | 0.3--0.6 |
| 纹理保留 | 30--60 | 0.1--0.25 |