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

Posted

技术标签:

【中文标题】使用 SciKit 和 python 检测图像中的对象【英文标题】:Detecting objects in images using SciKit with python 【发布时间】:2021-11-27 06:41:42 【问题描述】:

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

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

    读入图片 转换为灰度 绘制直方图 从这个阈值开始使用 otsupreferqbley 使用 skimage clear_border 删除所有不需要的对象,这些对象会触及边框

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

【问题讨论】:

【参考方案1】:

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

非零像素集合的欧拉特性。计算为连接组件数减去孔数(input.ndim 连通性)。在 3D 中,连接组件数加上孔数减去隧道数。

因此,对于剪刀,这将是 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= 关键字参数,您甚至可以计算由您可以想象的任何函数定义的其他属性。

【讨论】:

以上是关于使用 SciKit 和 python 检测图像中的对象的主要内容,如果未能解决你的问题,请参考以下文章

火炉炼AI机器学习046-图像边缘的检测方法

火炉炼AI机器学习048-Harris检测图像角点

火炉炼AI机器学习050-提取图像的Star特征

Python openCV检测平行线

使用 Python OpenCV 检测图像中的对象位置

图像分析用 OpenCV 与 Skimage,哪一个更好?