使用 SciKit 和 python 检测图像中的对象

Detecting objects in images using SciKit with python

我有一个图像处理问题,我正在努力寻找图像的解决方案。这是图片。基本上它是 python 中使用 scikit 图像的分割和计数问题。基本上我必须编写一个伪代码,说明我将如何计算我拥有的源图像中的这些“矩形”对象。矩形被不同形状和大小的其他不同对象包围。最近我做了一个类似的初学者问题来计算图像中的硬币数量。这个要容易得多,因为所有的对象都具有相同的性质。

你们中的任何人都可以帮助我了解如何计算剪刀,将它们与图像中的所有其他对象分开和隔离。到目前为止,我的思考过程是

  1. 读入图片
  2. 转换为灰度
  3. 绘制直方图
  4. 从这个阈值 preferqbley 使用 otsu
  5. 使用 skimage 删除所有不需要的边界对象 clear_border

然而,与简单且几乎完全相同的硬币不同,我不知道如何着手隔离矩形对象。 skimage 中是否有任何高级分割技术可用于此目的。就像我在想 blob,但我认为这在这里行不通。如果有人可以提供任何见解,请告诉我,我将非常感激

这取决于您需要解决方案的通用性。在您展示的图像中,剪刀是唯一有 两个孔 的物体。我们可以使用 skimage.measure.regionprops 属性 euler_number,在文档中描述为:

Euler characteristic of the set of non-zero pixels. Computed as number of connected components subtracted by number of holes (input.ndim connectivity). In 3D, number of connected components plus number of holes subtracted by number of tunnels.

所以,对于剪刀,这将是 1-2 = -1,而对于实心物体,它是 1,对于有 1 个孔的物体,它是 1-1 = 0。所以你可以说:

from skimage import measure

objects = measure.label(borders_cleared)
props_list = measure.regionprops(objects)
num_scissors = 0
for props in props_list:  # one RegionProps object per region
    if props.euler_number == -1:
        num_scissors += 1

当分割本身很容易时,如您显示的图像,那么我的策略始终是在 regionprops 中找到 属性 或属性组合,使我能够区分对象我对别人感兴趣。这可能是尺寸、伸长率、圆度……使用 extra_properties= 关键字参数,您甚至可以计算由您可以想象的任何函数定义的其他属性。