在图像中查找指定物品的最快方法是什么?

3
假设我们有一个简单的2D图形,其中填充了许多不重叠的圆形和少量星形图案。
如果我们要在所有这些圆圈中找到所有的星星,我能想到很少的方法。其中一种是暴力破解法。另一种可能是减小图像尺寸(到您仍然可以区分对象的最佳点),然后应用暴力破解法并映射到原始图像。暴力破解法的缺点当然是非常耗时的。我正在寻找更快的方法,可能是最快的方法。
在简单的2D图像上搜索指定项目的最快图像处理方法是什么?

1
这些星星都是一样的吗?它们只有平移变化吗?还是有旋转变化? - lijie
2
如果你只有圆和星星,我认为某种形式的直线检测是明智的,星星应该很快就会突出。 - Orbling
1
星星和圆形只是一个例子吗?因为针对这些高度规则的形状,最佳方法可能与针对更复杂或任意形状的最佳方法有很大不同。如果您没有使用圆形和星星,并且没有更具体的说明,那么您可能会得到一些技术上正确但无用的答案。 - allonym
星星和圆圈只是这里的例子。但更具体地说,我正在处理预随机化的灰度图像,需要找到特定指定的项目。 - Karl
参考上面的评论,似乎这个问题可能不再有效了。我只是在考虑在这种情况下寻找一个通用的解决方案。但是似乎没有这样的万无一失的解决方案,对吧? - Karl
4个回答

5
在图像中寻找对象的一种典型方法是通过交叉相关。基本上,您要寻找的对象(即掩模)和图像之间的交叉相关性最高的位置就是您要找的对象的可能位置。
为了简单起见,我将把您试图查找的对象称为星形,但通常可以是任何形状。
上述方法存在一些问题:
  • 掩模的大小必须与星形的大小匹配。如果您不知道星形的大小,则必须尝试不同大小的掩模。图像金字塔比仅迭代尝试不同大小的掩模更有效,但仍需要额外的努力。
  • 类似地,掩模和星形的方向必须匹配。如果它们不匹配,则交叉相关将无法工作。
由于这些原因,你越了解问题,它就变得越简单。这就是为什么人们在评论中要求更多信息的原因。通用解决方案,据我所知,实际上并不存在。也许有更有经验的人可以纠正我。

正如你所提到的,缩小图像的大小将有助于减少方法的计算时间。在我看来,这不是解决方案的核心元素--它只是一个可选的优化步骤。


2
如果形状很容易与背景分离,你可以计算出区分形状/颜色的描述符。根据问题的不同,你可以选择具有尺度、平移或旋转不变性的描述符(例如,如果每个形状都是唯一的,则选择紧凑性)。但我不知道这样做是否会更快。
如果你已经知道确切的形状并且有一个关于大小的想法,你可能想看看广义霍夫变换,它基本上是你的“暴力算法”的正式描述。

1

步骤1:阈值处理 - 如果通用图像集允许,将图像减少为1位(黑色或白色)。[对于您提到的示例类型,我猜阈值处理会很好地工作 - 留下足够的细节来查找对象]。

步骤2:可选地进行一些平滑/去噪处理。

步骤3:使用一些聚类方法来收集前景对象。

步骤4:使用适当的启发式方法来识别对象。

步骤1/2中的参数将在很大程度上取决于图像类型以及实验/观察。如果您已经正确解决了1/2,则3通常很简单。4将非常依赖于问题(例如,在您的情况下识别星星 - 这将取决于预期在图像中的星星的实际形状)。


1

由于您列出了形状不重叠的属性,因此我假设一个高效的算法能够:

  • 通过某种方式扫描图像来剪切所有形状(对于凸形状,我可以想象相对高效和简单的算法)
  • 当您剩下剪切出的形状时,您可以使用Misha提到的交叉关系

您应该更好地描述一下问题:

  • 形状是否可以旋转或缩放(或其他变换方式?)
  • 背景是否为均匀颜色?
  • 形状是否为均匀颜色?
  • 形状是否填充?

根据上述问题的答案,您可能会有更简单或更复杂的解决方案。

而且,也许这个 article 会很有趣。

如果形状非常规则,把它们转换成向量可能很适合您的需求,但这可能会有些过度,这确实取决于您以后想要做什么。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接