3

我正在做一个项目,我需要使用 opencv 检测图像上的特征。

我在用

SURF detector;
SURF extractor;
BFMatcher matcher;

用于检测、提取和匹配点。它适用于某些图像,但在某些其他图像上失败。

例如,系统在此图像上失败:

在此处输入图像描述

显然,这个图像有一些纹理,特征检测器应该检测到它们,但是没有检测到特征,因此没有生成匹配。

如何改进此功能检测?

我可以为此使用任何图像处理技术吗?

我可以使用其他任何检测器来解决这个问题吗?

4

1 回答 1

6

我没用过SURF,但是用过ORB算法。为了改进特征检测,我尝试了几个过滤器。我获得的最佳结果是结合使用滤波器均衡直方图和快速傅里叶变换。

均衡直方图过滤器:它增强无意义的细节并隐藏重要但小的高对比度像素,这些像素被假定为噪声。直方图均衡采用单调的非线性映射,它重新分配输入图像中像素的强度值,使得输出图像包含强度的均匀分布(即平面直方图)

快速傅里叶变换滤波器:它将图像分解为其正弦和余弦分量。该滤波器执行的变换的输出表示频域中的图像,而输入图像是空间域等效的。在傅里叶域图像中,每个点代表空间域图像中包含的特定频率。

我不确定,但我认为在 OpenCV 中没有 FFT 过滤器,因此您可能需要使用另一个库。

Edit1:我有一个代码,但不幸的是它是在 Java 中而不是在 C++ 中。但是,如果您将应用相同的过滤器,结果将是相同的。是 Eqaulize Histogram 的文档。为了应用 FFT 过滤器,我使用了 ImageJ,它是 Java 库。你可以尝试找到类似这个库的东西,比如这个

Edit2:应用 FFT 滤波器的 ImageJ 代码

import ij.plugin.filter.FFTFilter;
...
FFTFilter fft = new FFTFilter();
ImageProcessor ip = new ColorProcessor(bufImage);
ImagePlus imgPlus = new ImagePlus();

imgPlus.setImage(bufImage);

try{
   fft.setup(null, imgPlus); 
}catch(Exception e){e.printStackTrace();}
fft.run(ip);

Edit3:以下是在应用上述过滤器之前和之后检测到的特征的示例。

  1. 没有任何过滤器的 SURF: 在此处输入图像描述
  2. 带有 EH + FFT 的 SURF: 在此处输入图像描述
  3. 带 EH + FFT 的 ORB: 在此处输入图像描述

正如你在 SURF 算法中看到的,有太多的冗余信息来执行匹配。所以我建议你使用ORB算法。ORB的优点还在于它可以免费使用,图像旋转和缩放高效稳定。您还可以在应用 EH+FFT 之前对图像进行平滑处理,以仅检测角上的特征。

Edit4:我还发现了有关 FFT 的有用信息。根据这个主题, FFT 是 DFT 的有效实现。这是描述here。这也可能是最近的问题的答案四。

于 2013-10-14T15:20:04.870 回答