Canny:阈值和噪声
Canny 边缘由高斯 σ 和双阈值 hysteresis 决定;σ 太大结构断,太小噪声当边,OpenCV Canny 的 apertureSize 固定用 Sobel 3×3。

1. 霍夫 peak 全假,先查 Canny
车道线霍夫检测 peak 爆炸,RViz 满屏线。不是霍夫参数 alone——Canny 在纹理区碎成满天星,双阈值连的是梯度幅值,不是「看起来像边」。深度学习主导检测后,Canny 调参直觉仍有用:标定板边缘预处理、霍夫、contour 链路都直接吃 edge 质量。Canny 没有「万能阈值」——每张图最优双阈值随对比度变;产线固定光照才能固化 sigma 与双阈值进 config。
2. 四步链路与 API
- 高斯平滑 ,抑制噪声
- Sobel 求 ,幅值
- 非极大值抑制,方向量化 4 向
- Hysteresis:强边(大于 high)保留;弱边(low 到 high)仅当连到强边才保留
blur = cv2.GaussianBlur(gray, (0, 0), sigmaX=1.5)
edges = cv2.Canny(blur, threshold1=50, threshold2=150,
apertureSize=3, L2gradient=True)threshold1 比 threshold2 通常一比二或一比三。L2gradient 等于 True 用 L2 梯度幅值,更准略慢;False 用绝对值之和。apertureSize 三、五、七对应 Sobel kernel。Canny 输入必须 8-bit single channel;16-bit 先 convertScaleAbs。
3. σ 与阈值联动
Canny 不直接暴露 sigma——先 GaussianBlur 再 Canny,或调 blur kernel。sigma 大 → 边少且断;sigma 小 → 噪声边。plot M histogram,strong 取 90–95 percentile,weak 等于 0.4–0.5 乘 strong。光照均匀 scene 可用 median heuristic:
v = np.median(gray)
lower, upper = int(max(0, 0.66*v)), int(min(255, 1.33*v))
edges = cv2.Canny(gray, lower, upper, apertureSize=3)这是工程 heuristic,非 Canny 论文原意;对比度变化大的 scene 不可靠。
4. 下游关系
findContours 吃 edge 连通性;HoughLinesP peak count 直接反映 edge density。JPEG 块效应产生假边——源图质量是前置条件。现代 pipeline Canny 多作 debug viz,检测用 learned——但 debug 链路仍要可解释,sigma 与 threshold 联动关系不能丢。我会把 sigma、t_low、t_high 写进产线 config,跨班次对比 edge density 漂移。
5. 失败模式
| 情况 | 表现 |
|---|---|
| 纹理丰富 | 碎边 |
| 低对比 | 无 edge |
| JPEG 块效应 | 假边 |
| σ 过大 | 结构断 |
6. 验收
edge density vs σ 曲线;霍夫 peak count;小样本人工标注边 recall。固定 scene 记录参数进 config,跨班次对比 edge density 漂移。Canny 是梯度幅值阈值游戏——理解 hysteresis 连边机制,比死记 threshold 有用。
7. 案例:纹理区碎边导致霍夫 peak 爆炸
某车道线检测霍夫 peak 满屏,查 Canny 在沥青纹理区碎成满天星。先 GaussianBlur sigma 从一点零加到二点零,再调高 strong threshold,peak 降到可接受。不是霍夫参数 alone——edge 质量是前置。产线固定光照才能固化 sigma 与双阈值。
8. 与 Sobel 对照理解 threshold
单独跑 Sobel 看梯度幅值 histogram,可理解 threshold 该设在哪段。Canny 内部 NMS 方向量化四向;L2gradient 与绝对值之和梯度定义不同,threshold 数值不可直接迁移。理解链路比死记参数有用。
9. 下游 Hough 与 contour
findContours 后 RETR_EXTERNAL 取外轮廓;HoughLinesP peak count 直接反映 edge density。JPEG 块效应产生假边——源图质量是前置。现代 pipeline Canny 多作 debug viz,但 debug 链路仍要可解释。我会把 sigma、t_low、t_high 写进产线 config。
10. 验收清单
edge density vs σ 曲线;霍夫 peak count;小样本人工标注边 recall。固定 scene 记录参数,跨班次对比 edge density 漂移。产线固定光照才能固化参数;对比度变化大的 scene 不可靠。
11. 案例:低对比无 edge
某标定板边缘低对比,Canny 几乎无 edge,霍夫无 peak。先 stretch 对比度或降 strong threshold,再查 sigma。低对比不是霍夫参数 alone——edge 质量是前置。理解 hysteresis 连边机制,比死记 threshold 有用。产线固定光照才能固化 sigma 与双阈值;对比度变化大的 scene 用 median heuristic 不可靠。16-bit 图先 convertScaleAbs 再 Canny;JPEG 块效应假边要从源图质量治。Hough 与 contour 链路都直接吃 edge density,Canny 是前置不是可跳过。apertureSize 三对应 Sobel 三乘三;L2gradient 与绝对值之和 threshold 不可直接迁移。plot 梯度 histogram 选阈比死记 fifty/一百五十可靠;强边取 ninety–ninety-five percentile 是常见起点。高斯 sigma 与 Canny 双阈值联动:sigma 大边少且断,sigma 小噪声边。固定 scene 把 sigma、t_low、t_high 写进 config,跨班次对比 edge density 漂移;对比度变化大的 scene 不可靠。Canny 四步:高斯、Sobel 梯度、NMS、hysteresis 连边——理解链路比死记参数有用。下游 Hough 与 findContours 都直接吃 edge 质量。产线固定光照才能固化参数;JPEG 块效应与低对比要从源图与 sigma 联动治理,别只调霍夫 threshold。
相关
也可以看看
johan's blog