【发布时间】:2017-10-13 20:13:03
【问题描述】:
我有一个像下面的数组一样的像素数组,我想从中区分两个 1 的“组”。计划是在大量相似的像素阵列中执行此操作,因此我需要找到一种有效的方法。
也许我可以将所有 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, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 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, 0, 0]
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
]
【问题讨论】:
-
它有各种名称:“图像分割”、“连接组件分析”、“标签”和“Blob 分析” - 取决于您的目标和背景。
-
您可以将每个矩阵编码为图形并搜索连通分量。只要“组”不“接触”,这将起作用。或者,您可以运行某种形式的 K-means 聚类,只要您事先知道组件的数量,它就可以工作。还有许多其他选项,但您可能已经注意到,我们需要有关您的数据的更多详细信息,即可以做出哪些假设:您是否知道组的数量,它们是否线性可分,它们是否可以相互“接触”。 ..
-
你想做的事对我来说听起来很像flood filling,所以看看这样做的算法可能会很有成效(尽管一个纯 Python 实现可能太慢了)。
-
Pure Python 对于这个任务非常慢,考虑使用 scipy 或 OpenCV 之类的来做标签/连接组件。他们非常快。我用纯 Python 实现了连接组件,速度非常慢。
-
感谢您的回复,我会调查他们,看看是否找到适合我的东西。 @EliKorvigo 他们不能碰,每张图片中他们总是两个,但不幸的是不是线性可分的。
标签: python image image-processing