我正在做一个项目,我需要使用 opencv 检测图像上的特征。
我在用
SURF detector;
SURF extractor;
BFMatcher matcher;
用于检测、提取和匹配点。它适用于某些图像,但在某些其他图像上失败。
例如,系统在此图像上失败:
显然,这个图像有一些纹理,特征检测器应该检测到它们,但是没有检测到特征,因此没有生成匹配。
如何改进此功能检测?
我可以为此使用任何图像处理技术吗?
我可以使用其他任何检测器来解决这个问题吗?
我正在做一个项目,我需要使用 opencv 检测图像上的特征。
我在用
SURF detector;
SURF extractor;
BFMatcher matcher;
用于检测、提取和匹配点。它适用于某些图像,但在某些其他图像上失败。
例如,系统在此图像上失败:
显然,这个图像有一些纹理,特征检测器应该检测到它们,但是没有检测到特征,因此没有生成匹配。
如何改进此功能检测?
我可以为此使用任何图像处理技术吗?
我可以使用其他任何检测器来解决这个问题吗?
我没用过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:以下是在应用上述过滤器之前和之后检测到的特征的示例。
正如你在 SURF 算法中看到的,有太多的冗余信息来执行匹配。所以我建议你使用ORB算法。ORB的优点还在于它可以免费使用,图像旋转和缩放高效稳定。您还可以在应用 EH+FFT 之前对图像进行平滑处理,以仅检测角上的特征。
Edit4:我还发现了有关 FFT 的有用信息。根据这个主题, FFT 是 DFT 的有效实现。这是描述here。这也可能是您最近的问题的答案四。