图像处理:对'古柯'的算法改进

过去几年中我最感兴趣的项目之一就是一个关于图像处理的项目。 我们的目标是开发一个能够识别可口可乐'罐'的系统 (请注意,我强调'罐'这个词,你会在一分钟内看到为什么。 您可以在下面看到一个示例,其中可以通过缩放和旋转在绿色矩形中识别。

模板匹配

项目的一些限制:

  • 背景可能非常嘈杂。
  • 该罐可以具有任何比例或旋转或甚至定向(在合理范围内)。
  • 图像可能具有一定程度的模糊性(轮廓可能不完全是直的)。
  • 图像中可能有可口可乐瓶,算法只应检测罐头!
  • 图像的亮度可能会有很大的差异(所以你不能在颜色检测上“过多”)。
  • 罐子可以部分隐藏在侧面或中间,并且可能部分隐藏在瓶子后面。
  • 在图像中完全没有可能,在这种情况下,你必须找不到任何东西,并写出一条消息说明。
  • 所以你最终可能会遇到这样棘手的事情(在这种情况下,我的算法完全失败):

    总失败

    我前段时间做过这个项目,并且做了很多乐趣,并且我有一个体面的实现。 以下是关于我的实现的一些细节:

    语言 :使用OpenCV库在C ++中完成。

    预处理 :对于图像预处理,即将图像转换为更加原始的形式以提供给算法,我使用了2种方法:

  • 将颜色区域从RGB更改为HSV,并根据“红色”色调进行过滤,在特定阈值以上进行饱和以避免类橙色的颜色,并对低值进行过滤以避免产生深色调。 最终结果是二进制黑白图像,其中所有白色像素都代表与此阈值匹配的像素。 很明显,图像中仍然有很多垃圾,但是这会减少你需要处理的尺寸数量。 二值化的图像
  • 使用中值滤波进行噪声滤波(取所有邻居的中值像素值并用此值替换像素)以减少噪声。
  • 使用Canny边缘检测滤波器在2个先例步骤之后获取所有项目的轮廓。 轮廓检测
  • 算法 :我为这项任务选择的算法本身取自这本关于特征提取的精彩图书,并被称为广义霍夫变换(与常规霍夫变换非常不同)。 它基本上说了几件事情:

  • 您可以在不知道其分析方程的情况下描述空间中的物体(这里就是这种情况)。
  • 它可以抵抗像缩放和旋转等图像变形,因为它基本上会针对缩放因子和旋转因子的每种组合来测试图像。
  • 它使用算法将“学习”的基础模型(模板)。
  • 基于从模型中学到的内容,轮廓图像中剩余的每个像素将投票给另一个像素,该像素将被视为对象的中心(就重力而言)。
  • 最后,你会得到一张选票的热图,例如在这里can的轮廓的所有像素都会投票给它的引力中心,所以你将在同一个像素中得到很多投票,这对应于中心,并将在热图中看到一个高峰,如下所示:

    GHT

    一旦你有了这个,一个简单的基于阈值的启发式可以给你的中心像素的位置,从中可以导出比例和旋转,然后绘制你的小矩形(最终比例和旋转因子显然是相对于你的原始模板)。 理论上至少...

    结果 :现在,虽然这种方法适用于基本案例,但在一些地区却严重缺乏:

  • 非常慢 ! 我没有足够强调这一点。 需要几乎整整一天来处理30个测试图像,显然是因为我有很高的旋转和平移比例因子,因为一些罐子很小。
  • 当图像中的瓶子完全丢失时,由于某种原因,几乎总是找到瓶子而不是罐子(也许是因为瓶子更大,因此像素更多,因此投票更多)
  • 模糊的图像也不是很好,因为选票以中心周围随机位置的像素结束,因此以非常嘈杂的热图结束。
  • 翻译和旋转方面的差异已达到,但不是定向的,这意味着没有直接面对相机目标的罐头未被识别。
  • 您能否帮助我改进我的特定算法,仅使用OpenCV功能来解决上述四个具体问题?

    我希望有些人也会从中学到一些东西,毕竟我不仅认为提出问题的人应该学习。 :)


    另一种方法是使用尺度不变特征变换(SIFT)或加速稳健特征(SURF)提取特征(关键点)。

    它在OpenCV 2.3.1中实现。

    您可以在Features2D + Homography中使用功能找到一个很好的代码示例来查找已知对象

    两种算法对缩放和旋转都不变。 由于它们可以处理特征,因此您还可以处理遮挡(只要有足够的关键点可见)。

    在这里输入图片说明

    图片来源:教程示例

    SIFT的处理需要几百毫秒,SURF速度更快,但不适合实时应用。 ORB使用对旋转不变性较弱的FAST。

    原始文件

  • SURF:加速了强大的功能
  • 尺度不变关键点的独特图像特征
  • ORB:SIFT或SURF的高效替代品

  • 为了加快速度,我会利用这样一个事实,即不要求您找到任意图像/对象,但特别是带有可口可乐徽标的图像/对象。 这很重要,因为这个标识非常有特色,并且它在频域中应该有一个特征,尺度不变的特征,特别是在RGB的红色通道中。 也就是说,水平扫描线(在水平对齐的徽标上训练)遇到的红色到白色到红色的交替模式在穿过徽标的中心轴时将具有独特的“节奏”。 该节奏将在不同的尺度和方向上“加速”或“放慢速度”,但仍将按比例相等。 您可以识别/定义几十条这样的扫描线,横向和纵向穿过徽标,还有几个对角线,以星爆图案形式。 称这些为“签名扫描线”。

    签名扫描线

    在目标图像中搜索此签名是以水平条扫描图像的简单方法。 在红色通道中寻找高频(指示从红色区域移动到白色区域),一旦找到,看它是否跟随在培训课程中确定的一个频率节奏。 一旦找到匹配,您将立即知道扫描线在徽标中的方向和位置(如果您在训练过程中记录了这些事情),那么从中识别徽标的边界是微不足道的。

    如果这不是线性有效的算法,或者几乎如此,我会感到惊讶。 它显然没有解决你的罐子歧视问题,但至少你会有你的标识。

    (更新:为了识别瓶子,我会在标识附近寻找可乐(棕色液体) - 也就是说,在瓶子内部。或者,如果是空瓶子,我会寻找一个永远有相同的基本形状,大小和距离的标志,通常是全白色或红色。搜索一个纯色eliptical形状的帽子应该是,相对于标志,当然不是万无一失,但你的目标应该是快速找到容易的人。)

    (从我的图像处理时代开始已经有几年了,所以我保留了这个高层次和概念性的建议,我认为它可能略微接近人眼可能的运作方式 - 或者至少我的大脑是如何运作的!)


    有趣的问题:当我瞥了一下你的瓶子图像时,我认为它也是一个罐子。 但是,作为一个人,我做了什么来区分它,然后我注意到它也是一个瓶子......

    因此,要分开罐头和瓶子,先简单扫描瓶子怎么样? 如果你找到一个,在找罐之前掩盖标签。

    如果你已经在做罐子,不难实现。 真正的缺点是它会使处理时间加倍。 (但是想想现实世界的应用程序,你最终会想要做瓶子;-)

    链接地址: http://www.djcxy.com/p/2247.html

    上一篇: Image Processing: Algorithm Improvement for 'Coca

    下一篇: MIT vs GPL license