物体检测+分割

时间:2011-08-28 13:41:30

标签: image image-processing opencv object-detection

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

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

自从我进入图像处理世界已经有3个星期了,我已经读过很多算法(筛选,蛇,更多蛇,与傅里叶相关等),以及我不知道从哪里开始的启发式算法哪一个对我想要达到的目标来说是“最好的”。考虑到感兴趣的图像数据集是一个非常大的图像数据集,我甚至不知道我是否应该使用在OpenCV中实现的一些算法,或者我是否应该实现我自己的算法。

概述:

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

提前谢谢。

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

每个数据集由共享相同

的80K产品图像组成
  • 概念,例如T恤,手表,鞋子
  • 尺寸
  • 方向(其中90%)
  • 背景(95%)

显然,每个数据集中的所有图片看起来与产品本身几乎完全相同。为了使事情更加清晰,我们只考虑“监视数据集”:

集合中的所有图片看起来几乎都是这样的:

enter image description here

(再次,除了手表本身)。我想提取表带和表盘。事实上,有许多不同的手表风格,因此形状。从我到目前为止所读到的,我认为我需要一种模板算法,允许弯曲和拉伸,以便能够匹配不同风格的带子和表盘。

不是创建三个不同的模板(表带的上半部分,表带的下半部分,表盘),而是仅创建一个并将其分成3个部分是合理的。这样,我就可以充分相信每个部分都是按照预期的方式相互检测到的。表盘下方不会检测到表盘。

从我遇到的所有算法/方法中,活跃的形状模型似乎是最有希望的。不幸的是,我没有设法找到一个下降实现,我不能确信这是最好的方法,以便继续自己写一个。

如果有人能指出我应该寻找的东西(算法/启发式/图书馆/等),我会非常感激。如果您认为我的描述有点模糊,请随时提出更详细的说明。

2 个答案:

答案 0 :(得分:8)

从你所说的,乍一看就出现了一些事情:

  • 最简单的做法是使用OpenCV或CvBlob库对图像进行二值化并使用Connected Components。对于具有非复杂背景的简单图像,这通常是对象
  • HOwever,看着您的样本图像,基于纹理的分割技术可能效果更好 - 手表表盘,表带和背景明显不同于纹理/粗糙度,这可能是一种理想的分离方式。

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

答案 1 :(得分:3)

我想我会解决问题。我会使用手表中的一组强大功能将目标图像“拼接”到模板上,而不是寻找表盘。第一块表在表盘上有一组白色方块,第二块手表有许多白色圆圈。我希望每种类型的手表:

  • 将表盘中的方块或圆圈分割出来。分割步骤可能很棘手,因为它们通常都是比例和光依赖的
  • 估算上述特征区域的中心或角落。这些是新功能点。
  • 使用匈牙利算法匹配模板手表和目标手表之间的功能。或者,可以采用原始图像中每个特征点的周围环境,并使用互相关匹配这些特征点
  • 使用模板和目标之间的匹配功能来估算缩放,旋转和翻译
  • 拼接图像
  • 由于图像现在处于已知形式,因此可以简单地通过预设坐标
  • 提取区域