898 字
4 分钟
图像分割:轮廓检测与分析
2026-06-30
无标签

边缘是像素级的局部梯度变化,轮廓是从边缘或阈值结果中提取的连续曲线,通常以坐标点序列的形式表示。轮廓检测是连接”像素级边缘”和”物体级区域”的桥梁。

边缘与轮廓#

  • 边缘:每个像素的二元属性(是/不是边缘),缺乏拓扑结构。
  • 轮廓:有序的坐标点序列 (x0,y0),(x1,y1),,(xn1,yn1)(x_0, y_0), (x_1, y_1), \dots, (x_{n-1}, y_{n-1}),表示一条连通曲线,具有方向和拓扑关系。

从二值边缘图或阈值分割后的二值图中提取轮廓,是轮廓检测的基本路径。

轮廓提取#

给定一张二值图像 B(x,y)B(x,y)(1=前景,0=背景),轮廓提取算法寻找前景区域的边界。OpenCV 的 findContours 基于 Suzuki(1985)的算法,在单次扫描中同时提取轮廓和建立层级关系。

提取策略#

算法扫描图像,遇到前景像素时开始跟踪边界,用链码记录方向变化,直到回到起点。多个轮廓之间可以嵌套。

拓扑层级#

轮廓间的嵌套关系用父子层级(hierarchy)描述。OpenCV 定义了四种提取模式:

模式层级含义
RETR_EXTERNAL仅最外层忽略内部空洞,只返回最外圈轮廓
RETR_LIST无层级所有轮廓平等,不建立父子关系
RETR_CCOMP两级轮廓分为外轮廓和内轮廓(空洞),最多两层
RETR_TREE完全层级完整记录所有嵌套关系,最常用

每个轮廓的信息包含同类级下一个轮廓、上一个轮廓、第一个子轮廓、父轮廓的索引(无则为 -1)。

轮廓逼近:Douglas-Peucker 算法#

跟踪得到的轮廓通常包含大量冗余点(边缘上的共线点)。Douglas-Peucker(DP)算法用较少的点逼近原始轮廓,保留形状的主要特征。

算法流程:

  1. 在轮廓首尾点 A,BA, B 之间连一条直线。
  2. 找到轮廓上离该直线最远的点 CC,记距离为 dmaxd_{\max}
  3. dmax<εd_{\max} < \varepsilon,则用直线 ABAB 代替整段轮廓。
  4. dmaxεd_{\max} \geq \varepsilon,以 CC 为分割点将轮廓分为两段,分别递归执行 1–3。

ε\varepsilon 是逼近精度,ε\varepsilon 越大逼近越粗糙(顶点越少)。这一算法保证了输出轮廓的顶点数量是输入的一个紧凑子集。

轮廓特征#

提取轮廓后,可以计算一系列几何特征用于形状描述和匹配。以下以平面轮廓 C={(xi,yi)}C = \{(x_i, y_i)\} 为例。

基本特征#

特征公式含义
面积A=12i=0n1(xiyi+1xi+1yi)A = \frac{1}{2} \left\|\sum_{i=0}^{n-1} (x_i y_{i+1} - x_{i+1} y_i)\right\|有符号面积,正值表示顺时针
周长P=i=0n1(xi+1xi)2+(yi+1yi)2P = \sum_{i=0}^{n-1} \sqrt{(x_{i+1} - x_i)^2 + (y_{i+1} - y_i)^2}轮廓总长度
质心xˉ=1Axi, yˉ=1Ayi\bar{x} = \frac{1}{A} \sum x_i,\ \bar{y} = \frac{1}{A} \sum y_i区域几何中心

#

二维几何矩(moment)定义为:

mpq=xyxpyqB(x,y)m_{pq} = \sum_{x} \sum_{y} x^p y^q B(x,y)
  • m00m_{00}:零阶矩 = 区域面积
  • m01,m10m_{01}, m_{10}:一阶矩 → 质心 (m10m00,m01m00)(\frac{m_{10}}{m_{00}}, \frac{m_{01}}{m_{00}})
  • m02,m20,m11m_{02}, m_{20}, m_{11}:二阶矩 → 主轴方向、离散程度

中心矩 μpq\mu_{pq} 将坐标平移至质心处计算:

μpq=xy(xxˉ)p(yyˉ)qB(x,y)\mu_{pq} = \sum_{x} \sum_{y} (x - \bar{x})^p (y - \bar{y})^q B(x,y)

中心矩具有平移不变性。归一化中心矩 ηpq=μpq/μ00(p+q)/2+1\eta_{pq} = \mu_{pq} / \mu_{00}^{(p+q)/2 + 1} 进一步具有缩放不变性。

Hu 不变矩#

Hu(1962)用二阶和三阶归一化中心矩构造了 7 个不变矩 I1I_1I7I_7,同时具有平移、旋转和缩放不变性。例如第一个:

I1=η20+η02I_1 = \eta_{20} + \eta_{02}I2=(η20η02)2+4η112I_2 = (\eta_{20} - \eta_{02})^2 + 4\eta_{11}^2

Hu 矩在形状匹配中用于衡量两个轮廓的相似度,对刚性变换(平移、旋转、缩放)不敏感。

图像分割:轮廓检测与分析
https://biscuit0613.github.io/posts/cv/cv-seg-contour/
作者
Biscuit
发布于
2026-06-30
许可协议
CC BY-NC-SA 4.0
图像分割:Canny边缘检测
图像分割:水平集与快速行进法