使用matlab或Java查找相似的图像

12 浏览
0 Comments

使用matlab或Java查找相似的图像

在过去几年中,我参与的最有趣的项目之一是一个关于图像处理的项目。目标是开发一个系统,能够识别可口可乐\'罐子\'(注意我强调了\"罐子\"这个词,一会儿你就会知道原因)。下面是一个识别到的样本,可以看到罐子在带有比例和旋转的绿色框内:

\"Template

该项目有一些限制:

  • 背景可能非常嘈杂。
  • 罐子可能有任何比例或旋转,甚至可能有不同的朝向(在合理范围内)。
  • 图像可能可有一定程度的模糊性(轮廓可能不完全直线)。
  • 图像中可能有可口可乐瓶,算法应仅检测罐子!
  • 图像的亮度可能会有很大的变化(因此不能过于依赖颜色检测)。
  • 罐子可能部分隐藏在两侧或中间,可能部分隐藏在瓶子后面。
  • 图像中可能根本没有罐子,在这种情况下,您必须什么都不发现并写一条消息说明情况。

因此,你可能会遇到像这样诡异的事情(在这种情况下,我的算法完全失败了):

\"Total

我做这个项目已经有一段时间了,做的很开心,实现效果也还不错。下面是关于我的实现的一些细节:

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

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

  1. 将颜色空间从RGB转换为HSV,并基于“红色”色相进行过滤,饱和度高于某个阈值以避免类似橙色的颜色,并进行低值过滤以避免暗色调。最终结果是二进制的黑白图像,所有白色像素表示与此阈值匹配的像素。显然图像中仍然有许多垃圾内容,但这将减少您需要处理的维度。
  2. 使用中值滤波(取所有邻居像素的中位值,并将像素替换为此值)对噪声进行滤波,以减少噪声。
  3. 使用Canny边缘检测滤波器在前两步操作后获取所有项的轮廓。

算法:我选择用于此任务的算法来自于这本关于特征提取的精彩书籍,称为广义霍夫变换(与常规霍夫变换非常不同)。它基本上说了几件事:

  • 您可以在不知道其解析方程的情况下描述空间中的对象(这就是本例的情况)。
  • 它能够抵抗图像的形变,例如缩放和旋转,因为它会基本上为每个缩放因子和旋转因子组合测试您的图像。
  • 它使用算法将“学习”的基本模型(模板)。
  • 剩余的每个像素在轮廓图像中将为另一个像素投票,后者将根据从模型中学到的知识,被推测为您的对象的重心中心。

最终,您会得到一个基于投票的热图,例如在此处,沿着罐子的所有轮廓像素将投票票选其重心中心,因此您将在对应于中心位置的同一像素中获得大量票数,并在如下热图中看到峰值:

\"GHT\"

一旦您得到了这一点,一种基于阈值的简单启发式方法就可以为您提供中心像素的位置,从而可以推导出比例和旋转,然后在其周围绘制小矩形(最终比例和旋转因子显然相对于您的原始模板)。至少在理论上......

结果:现在,虽然这种方法在基本情况下有效,但在某些领域严重欠缺:

  • 非常慢!我没有强调这个问题足够。处理这30个测试图像需要几乎一整天的时间,因为我旋转和平移的缩放因子非常高,因为一些罐子非常小。
  • 当图像中有瓶子时,它就完全丢失了,并且出于某种原因几乎总是找到了瓶子而不是罐子(可能是因为瓶子更大,因此拥有更多像素,因此有更多的票数)
  • 模糊图像也不行,因为投票最终位于围绕中心的随机位置像素,因此最终热图非常嘈杂。
  • 虽然实现了平移和旋转不变性,但是没有实现方向不变性,这意味着没有直接面对摄像机物镜的罐子被识别。

您可以使用仅 OpenCV 功能帮助我改进我的特定算法,以解决提到的四个具体问题吗?

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

admin 更改状态以发布 2023年5月22日
0
0 Comments

为了加速处理速度,我会利用一个事实,即你不需要找到任何随意的图像/物体,而是特别找一个带有可口可乐标志的图像/物体。这很重要,因为这个标志非常独特,它在频域中应该有一个特征的,尺度不变的标志,尤其是在RGB的红通道中。也就是说,水平扫描线(训练于水平对齐的标志上)遇到的红色到白色到红色的交替图案,将在通过标志的中心轴线时具有独特的“节奏感”。该节奏感将在不同的尺度和方向上“加速”或“减速”,但会保持成比例的等效。你可以确定/定义几十条这样的扫描线,包括水平和垂直通过标志的线条,以及用辐射状的方式划分出的更多的对角线线条。称它们为“标志扫描线”。\n\n在目标图像中搜索这个标志,只需要水平分段扫描图像。寻找红通道中的高频率(表示从红色区域转移到白色区域),一旦找到,看看它是否紧随训练会话中识别出的频率节奏之一。一旦找到匹配项,你就可以立即知道扫描线的方向和标志中的位置(如果你在训练期间跟踪这些东西),从而从那里容易地识别标志的边界。\n\n如果这不是一种线性高效的算法,我会感到惊讶,或者几乎是线性高效的算法。它显然不能解决你的罐装瓶识别问题,但至少你能够找到你的标志。\n\n(更新:对于瓶子识别,我会寻找标志旁边的可乐(褐色液体)-也就是瓶子里面。或者,在空瓶的情况下,我会寻找一个盖子,它的基本形状、大小和距标志的距离将始终相同,并且通常是全白或全红的。寻找一个实心颜色椭圆形状,它在标志相对位置上应该是盖子的位置。当然这并不是绝对可靠的,但你的目标应该是快速找到容易的。)\n\n(已经过了几年了,我的图像处理日子还没完全停下,因此我把这个建议保持在高层次和概念性上。我认为这可能略微近似于人眼的工作方式 - 或者至少是我的大脑的工作方式!)

0
0 Comments

一个替代的方法是使用尺度不变特征变换(SIFT)或加速稳健特征(SURF)提取特征点。\n你可以在这个页面上找到一个漂亮的OpenCV代码示例,支持Java、C++和Python:使用特征匹配和Homography来查找已知的对象。\n这两个算法都对缩放和旋转不变。由于它们是针对特征点的,因此还可以处理遮挡(只要足够多的关键点可见)。\n处理SIFT需要几百毫秒,SURF稍微快一点,但不适用于实时应用程序。ORB使用了较弱的FAST算法,对旋转不变性较差。\n原始论文:\nSURF: Speeded Up Robust Features\nDistinctive Image Features from Scale-Invariant Keypoints\nORB: SIFT或SURF的高效替代方法

0