本节摘要:基于边缘的分割先找像素值剧变的位置,再把边缘连成封闭轮廓。Sobel 给梯度方向与幅值,Canny 走高斯、梯度、非极大值抑制、双阈值与滞后连接五步得到细线。活动轮廓把初始曲线按能量往边界收。线不等于区域,封闭与填充才交得出面积。
阅读完本节,你应当能够:
边缘在灰度上表现为陡坡。Sobel 用两组 3×3 核近似水平和垂直导数,幅值是两向平方和再开方,方向用反正切。幅值图亮处像墙。墙厚且毛糙,因为核小、噪声也有梯度。所以 Sobel 很少单独当分割结果,它是 Canny 和活动轮廓的原料,也是分水岭可用的地形。
核加大更平滑也更钝。先高斯再 Sobel,等于 Canny 的前两步。原文把 Sobel 与 Canny 并列,动手时记住:Sobel 输出是粗墙,Canny 输出是细线。要面积,细线还得封闭。
gx = cv2.Sobel(gray, cv2.CV_64F, 1, 0, ksize=3) gy = cv2.Sobel(gray, cv2.CV_64F, 0, 1, ksize=3) mag = cv2.convertScaleAbs(np.sqrt(gx * gx + gy * gy)) canny = cv2.Canny(gray, 80, 160)
高斯:降噪,标准差与目标边缘宽度匹配。梯度:常用 Sobel。非极大值抑制:只沿梯度方向留局部最大,墙变成接近单像素。双阈值:高于高阈的是强边,低于低阈的丢弃,中间是弱边。滞后连接:弱边若连着强边则收留,否则丢掉。这套设计让真正的长轮廓在断裂处被弱边补上,同时抑制孤立纹理。
低高阈值常用 1:2 或 1:3。绝对值随曝光变。我习惯按梯度幅值的分位数设,而不是抄 50 和 150。滞后救不了完全断开的缺口——缺口处没有任何弱边像素。这时形态学闭运算或霍夫直线(若目标是几何件)比继续拧阈值有效。
霍夫变换在原文边缘一节作为检测直线圆的工具出现。它不是通用分割,但对「工件是圆孔、车道是线」这类强几何极有效。检测到的几何再栅格化成掩码,比像素级深度学习更可解释。几何不成立时不要硬上霍夫。
Snake 一类方法放一条初始闭合曲线,能量包括:曲线要光滑(内力)、要贴高梯度(外力)、有时还要气球力往外胀以免缩成一点。迭代到能量低处停下。优点是直接得到封闭轮廓,面积自然有。缺点是初始必须靠近目标,凹陷处容易跨过去,多目标要多种子轮廓。
实践中初始来自阈值的凸包或用户画的框。医学超声里经典,现在常被 U-Net 取代,但作为「把粗掩码的边界吸到梯度上」的后处理仍有人用。别指望从图像中央随便放一个圈就吸到复杂器官上。
| 方法 | 输出 | 封闭性 | 对初始的依赖 |
|---|---|---|---|
| Sobel 幅值 | 粗墙 | 无 | 低 |
| Canny | 细线 | 不保证 | 低,但阈值敏感 |
| 霍夫 | 几何参数 | 由模型保证 | 几何假设 |
| 活动轮廓 | 闭合曲线 | 有 | 高 |
⚠️ 常见坑:把 Canny 图直接当掩码算 Dice。线的像素远少于区域,分数会惨,却不能说明边缘找错了。
💡 关键直觉:边缘方法回答「墙在哪」。要房契,还得把墙连成圈并填充。
把 Canny 膨胀几像素再填充孔,可以得到粗糙区域,用作第 3.1 节之外的另一条基线。若膨胀后仍千疮百孔,说明轮廓缺口太多,数据可能不适合纯边缘路线。

边缘适合边界清晰、背景干净的工业轮廓。纹理丰富的自然场景,Canny 会画出一树的叶子墙。深度学习的边界误差往往要用条件随机场或点监督来修,思想仍是「把标签吸到强边上」。你会在第 6 章后处理里再次见到:用形态学修,而不是再跑一次 Canny 当最终产品。
若任务是抠图发丝,Canny 不够,需要半透明带。不要用本节方法硬撑发丝产品。
缺口短:形态学闭运算,核略大于典型缺口。缺口沿直线:霍夫补线再栅格化。缺口不规则且目标孤立:活动轮廓从阈值凸包初始化往里收。三种都失败,说明边缘路线不适合这批图,换区域或学习,不要把双阈值拧出火星。
Canny 低高阈值按梯度分位数设,例如低取 70 分位、高取 90 分位,随曝光走。固定 50 和 150 在暗图上可能几乎没有强边,在亮纹理图上满屏都是强边。分位数法仍要冻结:在验证小集选一对分位,测试不改。滞后连接看的是连通,弱边孤岛会被丢,这是特性不是 bug。
活动轮廓能量项过多会调不完。先保证初始离目标近,再用梯度外力。气球力在目标有凹陷时可能跨过细颈,细胞凹陷核不要依赖它。迭代次数设上限,能量不降就停,避免在噪声上蠕动出花边。
很少当主分割。偶尔当可视化或当「边界准确率」的辅助度量:真值边界附近预测是否也有高梯度。产品掩码仍来自区域或网络。发丝抠图请换专用方法,Canny 会把头发画成折线。
Sobel 幅值可当分水岭的地形,比原灰度更贴「边界在高处」。噪声大时先轻度平滑。这是 3.2 与 3.3 的交叉用法,配置里写明地形是灰度还是梯度,复现才可能。
Canny 的低高阈值按梯度分位数取,在验证小集选一对分位冻结。暗图上固定 50、150 可能没有强边,亮纹理上又会满屏强边。滞后救不了完全断开的缺口,缺口短用闭运算,直线用霍夫,不规则用活动轮廓从凸包收。三种都失败,记录「边缘路线不适用」,换区域或学习。
Sobel 幅值可当分水岭地形,配置写明地形来源是灰度还是梯度。活动轮廓初始必须靠近,迭代设上限,能量不降就停,避免在噪声上蠕出花边。气球力跨细颈会毁掉凹陷核,细胞场景慎用。线转区域再比 Dice,直接用细线比面积会冤枉算法。
发丝与半透明不是本节产品。霍夫服务强几何圆孔与直线,几何假设不成立时不要硬上。深度学习主分割很少再以 Canny 当输出,但可用真值边界附近的梯度作为辅助可视化,检查模型是否贴边。产品掩码仍是区域。
分位数对冻结后测试不改。缺口三种补法都失败则放弃边缘主路线。地形来源写灰度或梯度。活动轮廓上限迭代,能量不降即停。线转区域再比 Dice。发丝不是本节。霍夫只在几何成立时。深度学习可用边界邻域梯度做可视化,产品仍交区域。Sobel 敏感噪声,前面平滑只一次,与 Canny 内置高斯不要重复交叠导致边界爬动。
分位数对写入契约后,测试脚本读契约不读魔法数。三种补缺口的失败记录进「边缘不适用」清单,清单非空则主路线改区域或学习。地形字段枚举灰度或梯度。轮廓迭代上限与能量早停成对出现。Dice 比较前必须封闭填充。发丝需求在任务书出现则本节方法标不适用。霍夫开关默认关,几何校验通过才开。可视化边界带不得当交卷。高斯只留一处。边界爬动用前后叠图差检测,差过大说明平滑过了。Canny 满屏强边时先查分位是否过低,不要先怪目标。活动轮廓初始离目标过远的样本直接跳过迭代,避免花边污染基线表。
反例档案:细线直接比 Dice,分数惨被当算法失败,封闭填充后其实可用。第二份:活动轮廓初始在图中央,迭代出花边进基线。过远跳过迭代后表干净了。高斯两处重叠造成爬动,叠图差检测抓住。发丝需求出现时本节标不适用,避免硬撑。
口令卡:分位契约、缺口清单、地形枚举、能量早停、先封闭再 Dice、发丝不适用、霍夫默认关。过远跳过迭代。高斯一处。满屏强边先查分位。可视化带不当交卷。
指导书:读契约分位、写缺口清单、枚举地形、早停能量、封闭再比、发丝退出、霍夫关。过远初始不迭代。满屏强边先查分位再怪目标。叠图差过大即平滑过度。可视化带与交卷分离。本节不适用时任务书应早标,避免项目中期才发现要发丝。
契约无分位对则 Canny 不准跑测试集。缺口清单为空却声称边缘主路线,退回。能量无早停的活动轮廓实现退回。未封闭就报 Dice 的脚本退回。任务书出现发丝仍走本节,退回。霍夫开关开着但几何校验未过,退回。初始过远仍迭代的样本应被跳过,未跳过则污染基线。叠图差超阈说明平滑过度,先减高斯。
现场抽问:分位对在契约哪一行?缺口清单在哪?能量早停有没有?Dice 是不是封闭后算的?发丝有没有误走本节?霍夫校验过了没?过远初始跳过了没?平滑叠图差超阈了没?答不全不准报边缘基线。
失败演练丙:不封闭报 Dice,脚本应拒。发丝任务走 Canny 主路线,应拒。霍夫无校验却打开,应拒。过远初始仍迭代,应跳过。平滑叠图差超阈仍提交基线,应拒。分位对缺失跑测试集,应拒。
六场拒绝条件写进脚本。不封闭、发丝误用、无校验霍夫、过远迭代、平滑超阈、缺分位,命中任一条基线无效。
六条拒绝写进脚本之后,基线表只接受绿灯实验。缺口清单与分位对是边缘路线的两张身份证,缺一不准自称基线。
身份证两张齐了,才允许把边缘结果写入体检表第三列。
边缘只是线索,交卷必须是封闭区域。活动轮廓初始化离目标太远会咬到另一团,初始圆或框要来自粗阈值,而不是手动画得很漂亮却不可复现。
下一节把像素丢进特征空间聚类:不靠梯度和种子,靠「颜色成团」。