15

我试图找到一种可接受复杂性的有效方法

  • 检测图像中的对象,以便将其与周围环境隔离
  • 将该对象分段为其子部分并标记它们,以便我可以随意获取它们

我进入图像处理领域已经 3 周了,我读过很多算法(筛选、蛇、更多蛇、傅立叶相关等)和启发式算法,我不知道从哪里开始,哪一个对于我想要实现的目标来说是“最好的”。考虑到感兴趣的图像数据集是一个相当大的数据集,我什至不知道是否应该使用在 OpenCV 中实现的某种算法,或者是否应该自己实现一个。

总结:

  • 我应该关注哪种方法?为什么?
  • 我应该将 OpenCV 用于那种东西还是有其他“更好”的选择?

先感谢您。

编辑——有关数据集的更多信息

每个数据集由 80K 的产品图像共享相同

  • 概念,例如 T 恤、手表、鞋子
  • 尺寸
  • 方向(90%)
  • 背景(其中 95%)

显然,除了产品本身之外,每个数据集中的所有图片看起来几乎相同。为了让事情更清楚一点,让我们只考虑“观察数据集”:

集合中的所有图片看起来几乎完全一样:

在此处输入图像描述

(同样,除了手表本身)。我想取出表带和表盘。问题是有很多不同的手表款式和形状。从我目前所读到的,我认为我需要一个允许弯曲和拉伸的模板算法,以便能够匹配不同风格的表带和表盘。

与其创建三个不同的模板(表带上部、表带下部、表盘),不如只创建一个并将其分成 3 个部分。这样,我就会有足够的信心,每个部分都被检测到彼此之间的关系,例如表盘不会在表带的下部下方被检测到。

在我遇到的所有算法/方法中,主动形状|外观模型似乎是最有前途的。不幸的是,我还没有设法找到一个下降的实现,而且我没有足够的信心这是最好的方法,以便自己继续编写一个。

如果有人能指出我应该真正寻找什么(算法/启发式/库/等),我将不胜感激。如果您再次认为我的描述有点模糊,请随时要求更详细的描述。

4

2 回答 2

8

从你所说的来看,乍一看,这里有一些东西:

  • 最简单的方法是将图像二值化并使用 OpenCV 或 CvBlob 库执行 Connected Components。对于具有非复杂背景的简单图像,这通常会产生对象

  • 然而,查看您的示例图像,基于纹理的分割技术可能效果更好 - 表盘、表带和背景在纹理/粗糙度方面是明智的变化,这可能是分离它们的理想方法。

    通过 Eigen 变换可以很容易地找到一部分的粗糙度(在SO上进行了一些解释,请查看那里提供的研究论文的链接),然后可以将 Mean Shift 滤波器应用于 Eigen 变换的输出。这将使区域根据纹理清晰地分开。金字塔均值偏移和通过 SVD 查找特征值都在 OpenCV 中实现,因此除非您可以优化自己的代码,否则就速度和效率而言,使用内置函数(如果存在)更好(并且更容易)。

于 2011-08-29T01:17:54.337 回答
3

我想我会扭转这个问题。我不会寻找表盘,而是使用手表中的一组强大功能将目标图像“缝合”到模板上。第一款手表的表盘上有一组白色方块,第二款手表有许多白色圆圈。我会每种类型的手表:

  • 分割出表盘中的正方形或圆形。分割步骤可能很棘手,因为它们通常都依赖于比例和光照
  • 估计上面找到的特征区域的中心或角落。这些是新的特征点。
  • 使用匈牙利算法匹配模板手表和目标手表之间的特征。或者,可以获取原始图像中每个特征点的周围环境,并使用互相关进行匹配
  • 使用模板和目标之间的匹配特征来估计缩放、旋转和平移
  • 缝合图像
  • 由于图像现在处于已知形式,因此可以简单地通过预设坐标提取区域
于 2011-08-29T22:07:14.990 回答