973 字
5 分钟
图像分割:分水岭算法
2026-06-30
无标签

拓扑解释#

分水岭算法将灰度图像视为一张拓扑地貌:每个像素的坐标 (x,y)(x,y) 对应平面位置,灰度值 I(x,y)I(x,y) 对应海拔高度。低灰度区域是”山谷”,高灰度区域是”山脊”。如果在每个局部极小值处刺穿一个小孔,将整个地形缓慢浸入水中,水从低处向高处漫延,当两个不同水源即将汇合时,在汇合处修筑”大坝”——这些大坝的连线就是分水岭(watershed),而被大坝分隔开的区域就是分割结果。

在数学上这一过程等价于:将图像中的每个局部极小值视为一个”汇水盆地”的种子,通过浸没模拟,让不同的汇水盆地不断扩张直到相遇,相遇处的边界即为分割线。

浸没算法#

模拟浸没的过程可以形式化为以下步骤:

  1. 检测局部极小值:找出图像中的所有灰度极小值区域,每个极小值赋予一个唯一标签。
  2. 灰度级升序处理:从最低灰度级开始,对每个灰度级的水位标记出与已有盆地区域连通的像素。
  3. 盆地扩张:当水位上升到一个灰度级时,当前灰度级中的像素可以分为三类:
    • 只与一个已有盆地连通的像素,归于该盆地。
    • 与多个盆地同时连通的像素,标记为分水岭边界。
    • 尚未与任何盆地连通的像素,成为新的局部极小值(新建盆地)。

这一过程持续到所有灰度级处理完毕,最终得到的边界线就是分水岭。

过分割问题#

对原始梯度图像直接使用分水岭几乎必然产生严重过分割——每个微小的局部极小值(可能来自噪声或纹理)都会形成一个独立的盆地,导致分割区域数量远多于目标数量。

过分割的根源在于图像中局部极小值的数量远远大于实际物体的数量。因此直接分水岭在实践中很少使用。

标记控制分水岭#

标记控制(Marker-Controlled)分水岭是解决过分割的标准方案。核心思想是”告诉算法哪些位置才是真正的盆地起点”,引导分割过程。

算法流程#

  1. 生成标记(Marker)

    • 内部标记:用形态学操作(开运算重建)或特定预处理方法,标识出每个目标物体内部区域。内部标记必须是前景中的连通区域。
    • 外部标记:标识背景区域,通常取内部标记之间的区域。外部标记可以用分水岭线本身来生成,或通过距离变换得到背景骨架。
  2. 修改梯度图:将原梯度图像修改为仅在标记位置有极小值,其余区域的极小值被压制。一个常用的策略是在标记位置强制置零,再用形态学重建恢复。

  3. 执行分水岭:在修改后的梯度图上运行分水岭算法,此时的盆地区域被限制在标记位置,分割结果与目标数量一致。

距离变换生成标记#

对于二值图像(经过阈值分割或形态学处理后的前景/背景图),距离变换计算每个前景像素到最近背景像素的距离。距离变换的峰值位置对应物体的中心区域,适合作为内部标记。常用距离度量:

  • 欧几里得距离:(x1x2)2+(y1y2)2\sqrt{(x_1-x_2)^2 + (y_1-y_2)^2}
  • 曼哈顿距离:x1x2+y1y2|x_1-x_2| + |y_1-y_2|

距离变换取局部极大值后,配合一定的阈值筛选,可以作为分水岭的内部标记。

图像分割:分水岭算法
https://biscuit0613.github.io/posts/cv/cv-seg-watershed/
作者
Biscuit
发布于
2026-06-30
许可协议
CC BY-NC-SA 4.0
图像分割:K均值聚类分割
HOG与LBP:经典特征描述子