【问题标题】:Check efficiently if two pixels of an image are connected有效检查图像的两个像素是否连接
【发布时间】:2015-10-25 00:31:15
【问题描述】:

假设你有一张任意的黑白图片,以下面的图片为例:

...........     ........... 
...........     ........... 
...........     ........... 
.OOO...O...     ........... 
X...O.O.OOY     XOOO...OOOY 
.....O.....     ........... 
...........     ........... 
...........     ........... 
...........     ........... 

其中"." 代表黑色像素,"O""X""Y" 代表白色像素

左图的XY 像素沿着O 的路径相互连接(以Moore's neighbourhood 而言)。而右侧图片XY 像素断开连接。通过拥有任意黑白图像,我需要高性能算法来回答某些像素组是否连接到另一组像素的问题。我很确定这个问题必须有完善的解决方案,因为这个问题看起来很常见,但我似乎找不到适合我的解决方案。顺便说一句,我知道 Flood Fill 算法,但目前我没有考虑它,因为它比回答最初的问题所需的工作更多。

我希望参考主题方向的任何信息,

附言

以防万一您回答了原始问题,也许您可​​能会回答以下问题:

...........
...........
...........
.OOO...O...
X...O.O.OOY
.....O.....
..........Z
..........U
..........V

如果能以下列形式回答最初的问题,也很好(但不是必须的):

像素X连接到像素Y

像素X未连接到像素Z

像素X未连接到像素U

像素X未连接到像素V

提前谢谢你!

【问题讨论】:

  • 深度优先或广度优先搜索(如链接问题中所示)将有效地回答任何这些问题。
  • 最佳算法取决于您的用例。您是否要拥有一张图像,然后在该图像上测试大量像素对?还是每次都是不同的图像?
  • 连接组件标签以最好的方式解决了我的问题,谢谢

标签: algorithm


【解决方案1】:

你是对的,这个问题很常见,并且有一个众所周知的高性能算法,它运行的时间与输入的大小成正比:O(n)(因为每个顶点最多有 8 条边)。您只需要通过图像创建一个图形,其中每个像素是顶点,边缘是 2 个顶点是相邻的。

然后有了一个图表,您只需在图表上运行DFS/BFS,从您的X 顶点开始,如果您到达Y,或者您的边界中没有任何东西,则停止。

请注意,您还可以在这里利用启发式算法,甚至使用A* algorithm(您的启发式算法是manhattan distance)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-29
    • 1970-01-01
    • 1970-01-01
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多