c# - 确定边缘检测处理图像的相似性

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

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

既然如此,让我给出一些定义:

项目目标:
该项目的目标,就像许多其他人在各种 SO 问题中寻求实现的一样(其中许多在这项工作的过程中对我非常有帮助),是检测
无论 parking 位已满还是可用,最终都会向用户报告(最好通过 iPhone 或 Droid 或其他移动应用程序以方便使用——由于时间限制,这方面很快被认为超出了我的努力范围)。

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

问题

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

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

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

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

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

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

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

最佳答案

让我试一试。

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

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

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

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

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

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

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

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

    编辑:我发现了一个 implementation of ShapeContext in C# @ CodeProject , 如果它有任何兴趣

    关于c# - 确定边缘检测处理图像的相似性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5776407/

    相关文章:

    matlab - 仅水平垂直线

    c# - 将长字符串二进制转换为十六进制 C#

    c# - 快速排序算法的问题

    android - Android Camera 参数中, PictureSize() 、 PreviewSize 和显示尺寸之间的关系是什么?

    python - 从 numpy 数组到 DICOM

    matlab - 使用canny方法进行一定程度的边缘检测

    android - 如何检测物体的外框

    image - 如何在opencv中找到图像中形状的角点?

    c# - 在 WebAPI C# 中请求反序列化期间捕获异常

    c# - 将 c# 数组传递给 javascript