【发布时间】:2015-11-23 17:49:15
【问题描述】:
我遇到了一种算法,它可以找到图形的轮廓,但我无法证明它为什么有效,我有点理解它为什么有效,但我无法推导出我自己在那里使用的公式。
这是算法:
假设我们有一个二值图像(图形为黑色,背景为白色)。所有像素都存储在一个二进制矩阵中,1为白色,0为黑色。
0) 找到第一个黑色像素(例如,如果它是一个正方形,那么它位于左上角)。
1) 设置 Lx = x 和 Ly = y(第一个像素的坐标),并且 Rx = x - 1 和 Ry = y。还要保留 2 个常量 firstX = x 和 firstY = y(我们稍后会需要它们)。
2) 计算 Tx = Rx + Ly - Ry 和 Ty = Ry + Rx - Lx。
3) 执行以下循环:
do {
if (m[Tx][Ty] == 0) {
Lx = Tx;
Ly = Ty;
m2[Tx][Ty] = 0;
} else {
Rx = Tx;
Ry = Ty;
}
if (Lx == Rx || Ly == Ry) {
Tx = Rx + Ly - Ry;
Ty = Ry + Rx - Lx;
} else {
Ty = (Ly + Ry - Lx + Rx) / 2;
Tx = (Lx + Rx + Ly - Ry) / 2;
}
} while (Tx != firstX || Ty != firstY);
在上面的代码中,m是原始图像,m2是只包含轮廓的图像。
我试图想象它是如何工作的,这就是我得到的:
显然它正在做一些曲折的运动来获得边缘上的零点并确定轮廓。
所以,我的问题是,这是一个已知的算法吗?这些公式究竟是如何得出的:
Tx = Rx + Ly - Ry;
Ty = Ry + Rx - Lx;
和
Ty = (Ly + Ry - Lx + Rx) / 2;
Tx = (Lx + Rx + Ly - Ry) / 2;
?
【问题讨论】:
-
有趣,我从未见过。我们可以参考吗?它可能类似于穿越迷宫的“右手在墙上”策略。经典方法在这里描述:imageprocessingplace.com/downloads_V3/root_downloads/tutorials/….
-
我还没有仔细研究过,但是 Tx/Ty 公式肯定是基于点 L 和 R 在 T 的附近,并且用于计算另一个点邻域,例如查找下一个顺时针邻域或类似的邻域。
-
@YvesDaoust 不幸的是,我没有任何参考资料,这个算法是从别人那里得到的,从别人那里得到的,等等,但我会问他们是否有什么推论!非常感谢您的链接。
标签: algorithm image-processing matrix geometry computational-geometry