我没用过SURF,但是用过ORB算法。为了改进特征检测,我尝试了几个过滤器。我获得的最佳结果是结合使用滤波器均衡直方图和快速傅里叶变换。
均衡直方图过滤器:它增强了无意义的细节并隐藏了重要但小的高对比度像素,这些像素被假定为噪声。直方图均衡采用单调非线性映射,重新分配输入图像中像素的强度值,使输出图像包含均匀分布的强度(即平坦直方图)
快速傅里叶变换滤波器:它将图像分解为其正弦和余弦分量。该滤波器执行变换的输出表示频域中的图像,而输入图像是空间域等效的。在傅里叶域图像中,每个点代表空间域图像中包含的特定频率。
我不确定,但我认为 OpenCV 中没有 FFT 过滤器,因此您可能需要使用另一个库。
编辑1:
我有一个代码,但不幸的是它是在 Java 中而不是在 C++ 中。但是,如果您将应用相同的过滤器,结果将是相同的。 Here 是 Eqaulize Histogram 的文档。为了应用 FFT 过滤器,我使用了 ImageJ,它是 Java 库。你可以尝试找到类似这个库的东西,比如this one。
Edit2:ImageJ 代码应用 FFT 过滤器
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:以下是应用上述过滤器前后检测到的特征示例。
- 没有任何过滤器的冲浪:
- 带有 EH + FFT 的 SURF:
- 带有 EH + FFT 的 ORB:
正如你在 SURF 算法中看到的那样,有太多的冗余信息来执行匹配。所以我建议你使用ORB算法。 ORB的优点还在于它可以免费使用,图像旋转和缩放高效稳定。您还可以在应用 EH+FFT 之前对图像进行平滑处理,以仅检测角上的特征。
Edit4:我还发现了有关 FFT 的有用信息。根据this topic FFT 是 DFT 的有效实现。描述为here。也可能是your最近的四个问题的答案。