如何在给定水平和垂直距离的二进制图像中找到邻居(Python)

时间:2016-08-10 07:40:09

标签: python scikit-image neighbours

我有一个需要分析的图像(或几百个)。目标是找到彼此接近的所有黑点。

例如所有黑点的水平距离为160像素,垂直为40像素。

Just a small part of an image

现在我只看一下每个Pixel,如果有一个黑色像素,我会调用一个递归方法找到它的邻居(如果你愿意,我也可以发布代码)

它有效,但速度很慢。目前脚本运行大约3-4分钟,具体取决于图像大小。

有没有一些简单/快速的方法来实现这一点(最好是scikit-image方法来帮助这里)我正在使用Python。

编辑:我尝试使用scikit.measure.find_contours,现在我有一个数组,其中的数组包含黑点的轮廓。现在我只需要找到这些轮廓附近的轮廓。

3 个答案:

答案 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_areacentroid属性,您可以使用这些属性来决定是否丢弃您可能不感兴趣的非常小的点,从而减少计算时间每对斑点附近)

如果您正在寻找粗略比较,那么比较每对标记区域之间的local_centroidbbox可能就足够了。

否则,您可以使用coords坐标来测量任意两个区域的外边界之间的确切距离。

如果您希望根据彼此最接近的每对区域的像素之间的精确距离做出决定,那么您可能不得不使用{{1}}财产。

答案 2 :(得分:1)

如果您的输入图像是二进制,则可以按如下方式分隔您感兴趣的区域:

  1. "长大"所有区域的预期距离(实际上是它的一半,当你从#34;两侧延伸")与binary_dilation,其中structure是一个核(例如矩形) :http://scikit-image.org/docs/dev/api/skimage.morphology.html#skimage.morphology.rectangle),让我们说,20x80像素;
  2. 使用生成的掩码作为skimage.measure.label的输入,为不同的区域分配不同的值。像素;
  3. 将您输入的图像乘以上面创建的蒙版到零扩散像素。
  4. 以下是您的图片和kernel = rectange(5,5)的建议方法的结果:

    扩张的二进制图像(步骤1的输出):

    enter image description here

    以上标记版本(步骤2的输出):

    enter image description here

    乘法结果(步骤3的输出):

    enter image description here