该代码首先使用 3x3 像素的邻域过滤二值图像。nfilter
是移动滤波器函数。它将遍历作为参数给出的图像中的所有像素,并根据相邻像素的值应用操作。
我不知道具体内容minutie
过滤器,但从代码的其余部分来看,它可能会计算全 1 邻域中值为 1 的像素。换句话说,在线段末尾,它等于 1;当有 3 个分支(分叉)时,它等于 3。
Example:
让过滤器对邻近的过滤器进行求和,如下所示:
sum(block(1,1:3), block(3,1:3), block(2,1), block(2,3))*block(2, 2);
where block
表示二值图像的每个像素周围的邻域。
在下面的左矩阵中(如果忽略边界例外),有一个位置的 1 在其 3x3 邻域中恰好有 1 个 1,在右矩阵中,有一个位置的 1 在其 3x3 邻域中恰好有 3 个 1邻里。
[0 0 0 0 0 [0 0 1 0 0
0 0 0 0 0 0 0 1 0 0
0 0 1 0 0 1 1 1 0 0
0 0 1 0 0 0 0 1 0 0
0 0 1 0 0] 0 0 1 0 0]
过滤后的输出将是:
[0 0 0 0 0 [0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 3 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0] 0 0 0 0 0]
它在左侧矩阵中发现了一个终止点,在右侧矩阵中发现了一个分叉点。
然后将滤波后的图像设置为值 1 和 3 的阈值,然后使用bwlabel
and regionprops
对我来说有些神秘†,因为分叉和终止点是单点,它们的位置就是它们的索引。我认为您可以使用以下方法简单地实现端点和分叉坐标的检测:
[It Jt]= find(L==1);
[Ib Jb]= find(L==3);
†我能想到的一个原因是,在matlab中图像和数组中的坐标是不同的,并且这两个函数以图像格式输出坐标,这更容易在原始图像上绘制。