【问题标题】:Feature Detection in Noisy Images噪声图像中的特征检测
【发布时间】:2012-02-21 21:26:02
【问题描述】:

我已经构建了一个带有网络摄像头和功能匹配的成像系统,这样当我四处移动摄像头时;我可以跟踪相机的运动。我正在做类似于here 的事情,除了使用网络摄像头框架作为输入。

它对于“好”图像非常有效,但是在非常低的光线下拍摄图像时会出现大量噪点(相机高增益),这会干扰特征检测和匹配。基本上,它没有检测到任何好的特征,当它检测到时,它无法在帧之间正确匹配它们。

有没有人知道一个好的解决方案?还有哪些其他方法可用于查找和匹配特征?

以下是两个特征非常低的示例图像:

【问题讨论】:

  • 你能发一张图片显示我们在这里谈论的“低光”吗?
  • 添加了图片。非常低的对比度
  • 我不明白,我们应该在你的图片中看到什么?
  • 翻译的是同一张图片,我需要一个很好的方法来以编程方式找出他们的翻译。特征匹配不起作用,因为没有足够的特征可以匹配。

标签: image-processing opencv noise noise-reduction


【解决方案1】:

我认为phase correlation 将是您在这里的最佳选择。它旨在告诉您两个图像之间的相移(即平移)。与特征检测相比,它对噪声更具弹性(但不能免疫),因为它在频率空间中运行;而特征检测器在空间上运行。另一个好处是,与特征检测方法相比,它非常快。我在 OpenCV 主干中有一个可用的实现,它位于 here 的亚像素精度。

但是,除了中间的折痕之外,您的图像几乎“毫无特色”,因此即使是相位相关也可能会遇到一些问题。把它想象成试图在暴风雪中检测翻译。如果你看到的都是白色的,你根本无法判断你已经翻译了,因此术语whiteout。在您的情况下,该算法可能会受到“greenout”的影响:)

您能否调整相机设置以在弱光条件下更好地工作。您是否完全打开了虹膜?你能忍受较低的帧率吗?设置更长的曝光时间将允许相机收集更多光线,从而以增加运动模糊为代价为您提供更多功能。或者,如果低光是您的默认环境,您可能需要为此设计的东西,例如红外摄像机,但这些可能很昂贵。除此之外,大镜头和长时间曝光是你的朋友:)

Histogram equalization 可能对提高图像对比度感兴趣。但是,有时它只会增强噪音。 OpenCV 有一个名为equalizeHist 的全局直方图均衡函数。对于更本地化的实现,您需要查看对比度受限自适应直方图均衡或简称CLAHEHere 是一篇很好的文章。 This 页面有一些很好的例子和一些代码。

【讨论】:

  • 我昨天实际上正在下载OpenCV的最新SVN,只是为了你写的功能。 (谢谢!:)) openCV 的安装很好,但是要让它在 x64 架构上运行有很多障碍——其中大多数是通过 cMake 查找和使用正确的文件。但是非常感谢!我会尽快试试这个。
  • 我想知道你是否可以帮助我。我正在使用你的 phaseCorrelation 代码在 openCV 中工作,我正在尝试找到一种方法来取回矩阵 C——我想看看 C 的样子。我已将此代码添加到您的方法中(_result 现在是函数参数):_result.create(C.size(), C.type());垫子结果 = _result.getMat(); uchar* 数据 = result.ptr(); for (int i=0;i