边缘是像素级的局部梯度变化,轮廓是从边缘或阈值结果中提取的连续曲线,通常以坐标点序列的形式表示。轮廓检测是连接”像素级边缘”和”物体级区域”的桥梁。
边缘与轮廓#
- 边缘:每个像素的二元属性(是/不是边缘),缺乏拓扑结构。
- 轮廓:有序的坐标点序列 (x0,y0),(x1,y1),…,(xn−1,yn−1),表示一条连通曲线,具有方向和拓扑关系。
从二值边缘图或阈值分割后的二值图中提取轮廓,是轮廓检测的基本路径。
轮廓提取#
给定一张二值图像 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)算法用较少的点逼近原始轮廓,保留形状的主要特征。
算法流程:
- 在轮廓首尾点 A,B 之间连一条直线。
- 找到轮廓上离该直线最远的点 C,记距离为 dmax。
- 若 dmax<ε,则用直线 AB 代替整段轮廓。
- 若 dmax≥ε,以 C 为分割点将轮廓分为两段,分别递归执行 1–3。
ε 是逼近精度,ε 越大逼近越粗糙(顶点越少)。这一算法保证了输出轮廓的顶点数量是输入的一个紧凑子集。
轮廓特征#
提取轮廓后,可以计算一系列几何特征用于形状描述和匹配。以下以平面轮廓 C={(xi,yi)} 为例。
基本特征#
| 特征 | 公式 | 含义 |
|---|
| 面积 | A=21∑i=0n−1(xiyi+1−xi+1yi) | 有符号面积,正值表示顺时针 |
| 周长 | P=∑i=0n−1(xi+1−xi)2+(yi+1−yi)2 | 轮廓总长度 |
| 质心 | xˉ=A1∑xi, yˉ=A1∑yi | 区域几何中心 |
二维几何矩(moment)定义为:
mpq=x∑y∑xpyqB(x,y)
- m00:零阶矩 = 区域面积
- m01,m10:一阶矩 → 质心 (m00m10,m00m01)
- m02,m20,m11:二阶矩 → 主轴方向、离散程度
中心矩 μpq 将坐标平移至质心处计算:
μpq=x∑y∑(x−xˉ)p(y−yˉ)qB(x,y)中心矩具有平移不变性。归一化中心矩 ηpq=μpq/μ00(p+q)/2+1 进一步具有缩放不变性。
Hu 不变矩#
Hu(1962)用二阶和三阶归一化中心矩构造了 7 个不变矩 I1–I7,同时具有平移、旋转和缩放不变性。例如第一个:
I1=η20+η02I2=(η20−η02)2+4η112Hu 矩在形状匹配中用于衡量两个轮廓的相似度,对刚性变换(平移、旋转、缩放)不敏感。