【问题标题】:Determining Similarity of Edge-Detection-Processed Images确定边缘检测处理图像的相似性
【发布时间】:2011-04-25 07:56:37
【问题描述】:

我希望我可以从 stackoverflow 社区获得一些指导,以解决我在高级项目中遇到的困境。首先,我想声明我是一个新手程序员,我相信你们中的一些人会很快告诉我这个项目超出了我的想象。我很快就意识到这可能是真的。

现在已经不碍事了,让我给出一些定义:

项目目标: 该项目的目标,就像许多其他人试图在各种 SO 问题中实现的一样(其中许多在这项工作的过程中对我非常有帮助),是检测 停车位是否已满或可用,最终将其报告给用户(最好通过 iPhone 或 Droid 或其他易于使用的移动应用程序——由于时间限制,这方面很快被认为超出了我的工作范围)。

使用工具: 我大量使用了 AForge.Net 库的资源,它为我提供了将项目整合到一起的所有构建块,包括从 IP 摄像机捕获视频、对图像应用过滤器并最终完成目标的检测。结果,你就会知道我选择用 C# 编程,主要是因为初学者易于使用。其他选项包括 MATLAB/C++、带有 OpenCV 的 C++ 和其他替代方案。

问题

这是我遇到问题的地方。下面链接了一张在 AForge 图像处理实验室中经过预处理的图像。使用的过滤器和过程的顺序是:灰度、直方图均衡、Sobel 边缘检测,最后是 Otsu Threshholding(尽管我不相信需要最后一步)。

http://i.stack.imgur.com/u6eqk.jpg

当然,您可以用肉眼从图像中看出,检测到的边缘序列显然是停在我用摄像头监控的空间中的汽车。这些汽车的清晰定义是亮化车轮的图案,这种“双铁轨”图案基本上代表了侧窗的外边缘,甚至在这种情况下也是车牌的轮廓。具体来说,在项目的延续中,选择的摄像机将是一个 PTZ,以覆盖尽可能多的街区,因此我只想关注汽车的侧面特征(消除车牌等因素) .也可以考虑天窗的矩形等特征,但显然这不是汽车的普遍特征,而一般的窗户轮廓是。

我们都可以看到这些模式存在差异,当然会因汽车品牌和型号而异。但是,通常这个序列不仅可以成功检索所需的特征,而且还可以消除视线中的道路(重要的是,如果您要检测空白空间,我打算使用道路颜色作为“第一个试金石”......如果我检测到与道路数据一致的灰度级,特别是如果在一个区域中没有检测到边缘,我觉得我可以安全地假设一个空白空间)。我的问题是这样的,希望它足够通用,对网站上的其他人实际上有益:

重点问题:
有没有办法拍摄一个图像片段(通过裁剪),然后将检测到的边缘序列与来自相机的未来新帧进行比较?更具体地说,有没有办法做到这一点,同时允许余地/基本上为边缘的微小差异创建公差阈值?

关于这个问题的个人想法/头脑风暴
- 我确信有一种方法可以逐个像素地进行逐个比较 - 裁剪到边缘周围的矩形,然后将裁剪后的图像滑过新处理的帧以逐个像素进行比较,但这不会除非您与检测到的边缘完全匹配,否则不会特别有帮助。

感谢所有帮助,我也很乐意根据需要进行澄清。

【问题讨论】:

  • 很抱歉,由于信息太多,我无法真正理解这个问题(而且我不知道哪些相关,哪些不相关)。也许我很慢,但我认为你应该集中你的问题。
  • 试图提供一点澄清。如您所见,我倾向于罗嗦的一面。

标签: c# image-processing edge-detection image-comparison


【解决方案1】:

让我试一试。

你有两张图片。让我们称它们为 BeforePic 和 AfterPic。对于这两张图片中的每一张,您都有一个 ROI(感兴趣的矩形) - 也就是裁剪的片段。

您想查看 AfterPic.ROI 是否与 BeforePic.ROI 有很大不同。 “非常不同”是指差异大于某个阈值。

如果这确实是你的问题,那么它应该分为三个部分:

  1. 获取 BeforePic 和 AfterPic(以及每个的 ROI)。
  2. 将图片\边缘差异的抽象概念转化为数字概念。
  3. 将差异与某个阈值进行比较。

第一部分并不是你问题的一部分,所以我会忽略它。 最后一部分基本上是基于找到正确的阈值。再次超出了问题的范围。 第二部分是我认为问题的核心(我希望我没有完全离开这里)。为此,我将使用算法 ShapeContext(在 PDF 中,您最好在第 3.3 节之前实现它,因为它对于您从 3.4 及更高版本的需求来说变得过于强大)。

Shape Context 是一种使用图像边缘的图像匹配算法,成功率很高。 实现这是我的决赛项目,它对你来说似乎是一个完美的匹配(不是双关语)。如果你的优势很好,并且你的投资回报率是准确的,那么它不会让你失望。

这可能需要一些时间来实施,但如果做得正确,这将非常适合您。 请记住,一个糟糕的实现可能会运行缓慢,我见过每张图像 5 秒的最坏情况。另一方面,一个好的(但不是完美的)实现将花费不到 0.1 秒的时间。

希望这会有所帮助,祝你好运!

编辑:我找到了一个implementation of ShapeContext in C# @ CodeProject,如果有任何兴趣的话

【讨论】:

  • @Neowizard 既然我们讨论的是图像相似度这个话题,那么由于 OpenCV 提供了简单的实现,基于特征值的方法会更快吗?第一个想法是获取两个图像的特征值并找到它们之间的相关性。相同意味着相关系数接近统一。可以定义一个实验阈值,从而拒绝不同的图像。
  • 这是我第一次听说这种基于特征值的对象识别方法,但是在浏览了链接的文章之后,我仍然不确定它是否会在原版中给出好的结果问题。缺陷检测代表了 CV 中的另一个问题,所以我不确定。另一方面,这是在 OpenCV 中实现(并且可能已优化)的,这给了它很大的赞誉。对我来说,这似乎是一种可靠的方法,值得尝试。如果它产生了良好的结果并且没有理由尝试另一个。
  • 哪个有效。实际上,现在我认为这种方法可能不太合适,因为它不是专门为在边缘图上使用而设计的。正在使用特征值,所以它一开始就弹出了。
  • 感谢您的回复和想法!你和丹·布莱恩特都提出了一些很棒的观点和想法,但也许更重要的是一些思考过程,这正是我所寻找的。作为一个新手程序员,我在这个项目中遇到的一个巨大挑战是,如果你在解决问题的策略方面愿意的话,那就是要达到“像 CS 一样思考”的心态。确实,After.ROI 与 Before.ROI 的比较正是我最终使用的方法,并且能够以最少的误报实现相当不错的成功率。
【解决方案2】:

我在工作中解决了相当多的机器视觉问题,我能告诉您的最重要的一点是越简单越好。方法越复杂,意外边界情况就越有可能导致失败。在工业中,我们通常通过尽可能简化条件来解决这个问题,施加严格的约束来限制我们需要考虑的事情的数量。诚然,学生项目与行业项目不同,因为您需要展示对特定技术的理解,这可能比它是否是您选择承担的问题的可靠解决方案更重要。

需要考虑的几点:

  1. 街道上是否有预定义的停车位?您是否可以选择手动预定义摄像头将观察到的停车区域?这样可以大大简化问题。

  2. 当汽车被非法停放(例如占用多个位置)时,您是否允许提供错误的结果?

  3. 当空间中出现垃圾、坑洞、积水或雪等意外环境条件时,是否允许提供错误结果?

  4. 您是否需要支持所有类别的车辆(汽车、平板车、货车、送货车、摩托车、迷你电动车、三脚架车?)

  5. 您是否可以在没有汽车的情况下拍摄街道的基线快照?

至于比较两组边缘,可能最稳健的方法称为几何模型查找(在数学上将感兴趣的边缘描述为一系列“边缘”,将它们组合成链并比较几何形状),但这是过度杀死您的应用程序。我会更多地关注停车区域中存在的“边缘像素”计数的阈值或与基线图像的差异(但是需要注意图像偏移,因为室外温度变化引起的材料膨胀可能会导致视野由于相机机械移动而略有变化。)

【讨论】:

  • 丹,感谢您的想法和帮助。你的很多“要考虑的点”是我已经开始考虑、思考或研究的事情,但你已经列出了一些有用的点和要考虑的策略,其中一些肯定会进入我的最终设计和代码.我希望我能给您和 Neowizard 都接受的答案检查,因为您提供的有益信息是你们应得的。
猜你喜欢
  • 1970-01-01
  • 2015-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-17
  • 1970-01-01
  • 2010-12-01
相关资源
最近更新 更多