我有一个需要分析的图像(或几百个)。目标是找到彼此接近的所有黑点。
例如所有黑点的水平距离为160像素,垂直为40像素。
现在我只看一下每个Pixel,如果有一个黑色像素,我会调用一个递归方法找到它的邻居(如果你愿意,我也可以发布代码)
它有效,但速度很慢。目前脚本运行大约3-4分钟,具体取决于图像大小。
有没有一些简单/快速的方法来实现这一点(最好是scikit-image方法来帮助这里)我正在使用Python。
编辑:我尝试使用scikit.measure.find_contours
,现在我有一个数组,其中的数组包含黑点的轮廓。现在我只需要找到这些轮廓附近的轮廓。
答案 0 :(得分:2)
当你得到不同黑点的坐标,而不是计算所有黑色像素对之间的所有距离时,你可以使用cKDTree(在scipy.spatial中,http://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.cKDTree.html#scipy.spatial.cKDTree)。使用cKDTree的确切方法取决于您的确切标准(例如,您可以使用cKDTree.query_ball_tree来了解是否存在属于两个不同标签的一对点,并给出最大距离)。
KDTrees是一种降低基于相邻点的问题复杂性的好方法。如果你想使用KDTrees,你需要重新调整坐标,以便你可以使用其中一个经典规范来计算点之间的距离。
答案 1 :(得分:1)
免责声明:我根本不熟悉scikit图像库,但是我已经使用MATLAB解决了类似的问题,所以我已经搜索了相同的方法。 scikit,我希望下面的调查结果可以帮到你。
首先,您可以使用返回background=255
的{{3}},即所有连接区域都标有相同数字的图像。我相信您应该使用background
调用此函数,因为根据您的描述,图像中的背景似乎是while区域(因此值为255)。
这实际上是一个图像,其中0
像素被赋值1
,并且构成每个(连接)点的像素被赋予整数标签的值,因此所有像素都是一个点将标有值2
,另一个点的像素将标有值label_image
,依此类推。下面我将参考" spot"和#34;标记的区域"互换。
然后,您可以调用skimage.measure.label,将上一步中获得的RegionProperties
作为输入。此函数返回RegionProperties
列表(每个标记区域一个),这是标记区域属性的摘要。
取决于您对
的定义目标是找到彼此靠近的所有黑点。
您可以使用bbox
的不同字段来帮助解决问题:
centroid
为您提供包含标记区域local_centroid
为您提供该标记区域的质心像素的坐标bbox
为您提供相对于边界框area
(注意还有bbox_area
和centroid
属性,您可以使用这些属性来决定是否丢弃您可能不感兴趣的非常小的点,从而减少计算时间每对斑点附近)
如果您正在寻找粗略比较,那么比较每对标记区域之间的local_centroid
或bbox
可能就足够了。
否则,您可以使用coords
坐标来测量任意两个区域的外边界之间的确切距离。
如果您希望根据彼此最接近的每对区域的像素之间的精确距离做出决定,那么您可能不得不使用{{1}}财产。
答案 2 :(得分:1)
如果您的输入图像是二进制,则可以按如下方式分隔您感兴趣的区域:
binary_dilation
,其中structure
是一个核(例如矩形) :http://scikit-image.org/docs/dev/api/skimage.morphology.html#skimage.morphology.rectangle),让我们说,20x80像素; skimage.measure.label
的输入,为不同的区域分配不同的值。像素; 以下是您的图片和kernel = rectange(5,5)
的建议方法的结果:
扩张的二进制图像(步骤1的输出):
以上标记版本(步骤2的输出):
乘法结果(步骤3的输出):