边缘检测图像相似性的确定

4
我希望能从stackoverflow社区获得一些指导,解决我在毕业项目中遇到的困境。首先,我想声明我是一个初学者程序员,我相信你们中的一些人很快就会告诉我这个项目超出了我的能力范围。我很快就意识到这可能是真的。
既然说到这里了,让我给出一些定义:
项目目标: 像许多其他SO问题一样,该项目的目标是检测停车位是否已满或可用,并最终向用户报告(理想情况下,通过iPhone、Droid或其他移动应用程序进行使用的便利性 -- 由于时间限制,这方面很快被认为超出了我的努力范围)。
工具使用: 我大量使用了AForge.Net库的资源,该库为我提供了从IP摄像机捕获视频、对图像应用滤镜以及最终完成检测目标的所有构建块。因此,您会知道我选择使用C#进行编程,主要是因为对初学者来说易于使用。其他选项包括MATLAB/C++、带有OpenCV的C++和其他替代方案。
问题: 这就是我遇到问题的地方。下面链接了一张在AForge图像处理实验室中预处理过的图像。使用的滤镜和过程序列是:灰度化、直方图均衡化、Sobel边缘检测,最后是Otsu阈值处理(尽管我不确定最后一步是否必要)。

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

从图像中,肉眼当然可以看出,有一系列检测到的边缘是我正在监控的空间中停放的汽车。这些汽车可以通过明亮的车轮模式、表示侧窗外边缘的“双铁路轨道”模式以及甚至是车牌轮廓来清晰地定义。具体而言,在项目继续进行中,所选择的摄像机将是一个PTZ,以覆盖尽可能多的街区,因此我只想关注汽车的侧面特征(消除诸如车牌之类的因素)。也可以考虑一些功能,例如天窗的矩形,但显然这不是汽车的通用功能,而车窗轮廓则是。
我们都能看到这些模式之间的差异,当然会因车型和制造商而异。但是,通常情况下,这个序列不仅可以成功检索所需的特征,而且还可以消除道路的视线(这很重要,因为我打算将道路颜色作为“第一个试金石”,以便检测空白区域…如果我检测到与道路数据一致的灰度级别,尤其是在某个区域没有检测到边缘时,我认为我可以安全地假定为空白区域)。我的问题是这样的,希望它足够普遍,对站点上其他人有实际的益处:

专注问题:
是否有一种方法可以通过裁剪来获取图像片段,然后将检测到的边缘序列与摄像机未来的新帧进行比较?更具体地说,是否有一种方法可以在允许余地/创建边缘微小差异容忍度的同时进行比较?

个人想法/头脑风暴关于问题::
-- 我确信有一种逐像素比较的方法-- 裁剪出仅围绕您的边缘的矩形,然后将裁剪的图像滑动到新处理的帧中进行逐像素比较,但除非您检测到精确匹配的边缘,否则这并没有什么用。

非常感谢您的帮助,如果需要我会很乐意进行澄清。


非常抱歉,由于信息过多(我无法确定哪些是相关的,哪些不是),我实在无法理解这个问题。也许我反应有点慢,但我认为您应该集中精力提出问题。 - Neowizard
试图提供一点澄清。正如您所看到的,我倾向于用较多的文字来表达。 - Mike D.
2个回答

4

让我试一下。

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

你想知道AfterPic.ROI与BeforePic.ROI是否非常不同。所谓“非常不同”,是指差异大于某个阈值。

如果确实是这个问题,那么它应该被分成三个部分:

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

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

形状上下文是一种使用图像边缘进行图像匹配的算法,具有很高的成功率。 实现这个是我的期末项目,看起来像是一个完美的匹配(没有双关语)适合你。如果你的边缘很好,你的ROI准确,它就不会让你失望。

可能需要一些时间来实现,但如果做得正确,这将完美地为你工作。 请注意,一个糟糕的实现可能运行缓慢,我见过最坏的情况是每张图片5秒钟。另一方面,一个好(但不完美)的实现将每张图像花费不到0.1秒。

希望这能帮助你,祝你好运!

编辑:我在CodeProject上找到了一个C#中的ShapeContext实现链接,如果感兴趣的话。


@Neowizard,既然我们正在讨论图像相似性,那么基于特征值的方法会更快,因为OpenCV提供了直接的实现方式吗?首先想到的是获取两个图像的特征值,然后找到它们之间的相关性。如果完全相同,则相关系数接近于1。可以定义一个实验阈值,使不相似的图像被拒绝。 - AruniRC
这是我第一次听说基于特征值的物体识别方法,但是在浏览了相关文章后,我仍然不确定它是否能够为原始问题提供良好的结果。缺陷检测在计算机视觉中代表了一个不同的问题,因此我对此并不确定。另一方面,这已经在OpenCV中实现(并且可能已经优化),这使得它具有很高的信誉。对我来说,它似乎是一种可靠的方法,并值得尝试。如果它产生了良好的结果,并且没有理由尝试其他方法。 - Neowizard
1
无论哪种方法都可以。实际上,我认为这种方法可能并不适用于边缘地图,因为它没有专门为此设计。一开始使用特征值时就出现了这个问题。 - AruniRC
感谢您的回复和想法!你和丹·布莱恩特都提出了一些很好的观点和想法,但也更重要的是一些思维过程,这正是我所期望的。作为一个新手程序员,我在这个项目中遇到的一个大挑战就是要像计算机科学家一样思考解决问题的策略。实际上,比较 After.ROI 和 Before.ROI 就是我最终采用的方法,并且能够以最小的虚警率取得相当不错的成功率。 - Mike D.
@AruniRC 特征值绝对是我在研究中遇到的一个话题/策略,但它似乎比我有时间或知识有效地实现的要高级一些。我的大部分工作都是基于 Aforge C# 库与 Open/EmguCV 的知识,这样的功能在那里没有实现。然而,由于 OpenCV 往往是计算机视觉编程的顶尖/标准,正如 Neowizard 所说,它绝对值得进一步实验和研究,以帮助更强大的解决方案。 - Mike D.

3
我在工作中处理了很多机器视觉问题,我能告诉你最重要的是简单就是好。方法越复杂,就越可能出现意外边界情况导致失败。在工业领域,我们通常通过尽可能简化条件、强制施加限制来减少需要考虑的事物数量来解决这个问题。当然,学生项目与工业项目不同,因为你需要展示对特定技术的理解,这可能比解决你选择的问题更重要。
以下是需要考虑的几个问题:
1. 街道上是否有预定义的停车位?您是否可以手动预定义相机将观察到的停车区域?这可以极大地简化问题。 2. 当汽车违法停车(例如占用多个停车位)时,您是否允许提供错误的结果? 3. 当出现意外环境条件(例如垃圾、坑洼、积水或停车位上的雪)时,您是否允许提供错误的结果? 4. 您是否需要支持所有类型的车辆(汽车、平板卡车、货车、摩托车、小型电动车、三轮车等)? 5. 是否允许在没有车辆的情况下拍摄街道的基准快照?
至于比较两组边缘,最稳健的方法可能是称为几何模型查找的方法(将感兴趣的边缘数学描述为一系列“边缘点”,将它们组合成链并比较几何形状),但这对您的应用来说有些过度。我会更倾向于查看停车区域中存在的“边缘像素”计数的阈值或与基准图像的差异(需要注意图像移位,因为室外温度变化引起的材料膨胀可能导致视野略微改变,因为相机机械移动)。

Dan,感谢你的想法和帮助。你提出的许多“需要考虑的要点”是我已经开始考虑、思考或研究的事情,但你命名了许多有用的要点和策略,其中一些肯定被纳入了我的最终设计和代码中。我希望我能给你和Neowizard都一个采纳答案的勾选,因为你们俩都由于提供的有益信息而值得这样做。 - Mike D.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接