边界描绘子
一些简单的描绘子
边界的长度是最简单的描绘子。4连接边界的长度定义为该边界上的像素数减一。8连接则将垂直和水平过度计为1,对角过度计为√2。
边界的直径定义为边界上两个距离最远的点之间的欧式距离。连接这些点的线段称为边界的长轴。边界的短轴定义为与长轴垂直的直线,由边界与两个轴相交的4个外部点所组成的方框,可以完全包围该边界。这个方块称为基本矩形,长轴与短轴之比称为边界的偏心率。
函数diameter可以计算边界或区域的直径、长轴、短轴和基本矩形
s = diameter(L)
其中L是一个标记矩阵,s是一个结构
s.Diameter | 一个标量,最大距离 |
s.MajorAxis | 一个2* 2矩阵,包含长轴端点的行列坐标 |
s.MinorAxis | 一个2* 2矩阵,包含短轴端点的行列坐标 |
s.BasicRectangle | 一个4*2矩阵,它的每行包含基本矩形的一个角的行列坐标 |
形状数
通常基于4方向弗雷曼链码的边界的形状数定义为最小幅值的一阶差分。形状数的阶定义为其表示中的数字的个数。因此,一个边界的形状数可由函数fchcode的参数c.diffmm给出,且形状数的阶由length(c.diffmm)给出。
函数fchcode使用语法
c = fchcode(b, conn, dir)
来计算一个储存在数组b中的有序边界点的np* 2集合的弗雷曼链码。输出c是包含以下字段的一个结构,其圆括号中的数字表示数组大小:
c.fcc = 弗雷曼链码(1* np)
c.diff = c.fcc的一阶差分链码(1* np)
c.mm = 最小幅度的整数(1* np)
c,difffmm = 链码c.mm的一阶差分(1* np)
对于任意旋转的一种归一化方法是将坐标轴之一与长轴对齐,然后基于旋转后的图形提取4链码。使用函数x2majoraxis可使x轴与一个区域或边界的长轴对齐。
[C, theta] = x2amjoraxis(A, B)
其中A = s.MajorAxis来自函数diameter,B是一幅输入(二值)图像或边界列表。输出C的形式与输入相同(即一幅二值图像或一个坐标序列)。因为可能会存在舍入误差,且旋转可能会产生一个不连接的边界序列,所以可能需要后处理来重新连接这些点,如使用bwmorph或connectpoly函数。
傅里叶描绘子
对边界坐标序列s(k) = x(k) +jy(k), 使用离散傅里叶变换(DFT), 可以得到边界的傅里叶描绘子,复系数a(u)。相应的,使用复系数a(u),也可以重建s(k)。
高频分量决定细节部分,低频分量决定总体形状。
函数frdescp可以计算边界s的傅里叶描绘子,函数ifrelescp则可根据给定描绘子计算其反变换,得到一条封闭的空间曲线。
描绘子应当尽可能对平移、旋转和尺度变化不敏感,并且描绘子对起点不敏感。傅里叶描绘子并非对这些几何变化不敏感,但这些参数的变化可能与描绘子的简单变换是相