1
4
你的算法允许整个图像,除了一个像素,成为“轮廓”。我不确定那正是你想要的;通常轮廓是 边境 考虑以下图像。
在这里,我将所有内容都标记为“黑暗”(<50,也许)作为
现在你试着沿着黑暗区域的外边缘移动,一次一个像素。首先,你朝着明亮的方向看(例如,直接向左看)。然后你逆时针旋转直到你碰到一个暗像素。
一旦你击中位置
通过这种方式,你可以一个像素一个像素地绕着轮廓走——既可以识别轮廓,也可以得到像素的顺序——直到你与你开始使用的同一个像素发生碰撞
和
会离开它,所以你击中了你第一次离开它时做的同一个像素。然后轮廓闭合。在我们的例子中,我们制作一个8连通的轮廓(即,我们看8个邻域,而不是4个邻域),我们会得到以下结果(其中
在这一点上,你已经涵盖了 一 整个边界。但可能还有其他人。一直在亮像素旁边寻找暗像素,直到你在它们上面画了一个轮廓。现在,您已经转换了两级图片(深色&明亮的像素)形成一组轮廓。 如果轮廓太嘈杂,首先考虑模糊图像。这将使轮廓变得平滑(或者,您可以先找到等高线,然后使用移动窗口平均坐标。) |
2
1
|
3
1
我还试图创建一个算法,将连接到平滑曲线轮廓点。查看我的开源项目 http://outliner.codeplex.com . 这个想法和fuzzxl提出的是一样的,但我不理解他对复杂性的担忧:处理时间与所有轮廓笔划的总长度成正比。 |
4
0
我不知道收集这些积分是否能帮你走得更远(我能想出一些情况,在这种情况下,几乎不可能知道他们应该按哪个顺序来。)
|
5
0
或许可以试试:
可能不太好,因为复杂性有点像O(n)。正如aioobe所建议的,你可以通过只寻找接近起点的点来简化这个过程。这个算法很好,如果点之间的距离只有2-3px,但是可能会创建非常奇怪的网格。 |
6
0
另请参见 Flood fill 可爱的小程序 mapping-a-branching-tile-path |