c – 如何改进opencv中的功能检测
作者:互联网
我正在开发一个项目,我需要使用opencv检测图像上的功能.
我在用
SURF detector;
SURF extractor;
BFMatcher matcher;
用于检测,提取和匹配点.它适用于某些图像,但在其他图像上失败.
例如,系统在此映像上失败:
显然,此图像具有一些纹理,并且特征检测器应检测它们,但未检测到任何特征,因此不会生成匹配.
如何改进此功能检测?
我可以使用任何图像处理技术吗?
我可以使用哪种其他探测器来帮助解决这个问题?
解决方法:
我没有使用过SURF,但是使用了ORB算法.为了改进功能检测,我尝试了几种过滤器.我获得的最好结果是使用滤波器Equalize Histogram和Fast Fourier Transform的组合.
均衡直方图滤波器:它增强了无意义的细节并隐藏了重要但小的高对比度像素,这些像素被假定为噪声.直方图均衡采用单调非线性映射,其重新分配输入图像中的像素的强度值,使得输出图像包含均匀的强度分布(即,平直线图)
快速傅里叶变换滤波器:它将图像分解为正弦和余弦分量.由此滤波器执行的变换的输出表示频域中的图像,而输入图像是等效的空间域.在傅里叶域图像中,每个点表示包含在空间域图像中的特定频率.
我不确定,但我认为在OpenCV中没有FFT过滤器,所以你可能需要使用另一个库.
EDIT1:
我有一个代码,但不幸的是它是Java而不是C语言.但是,如果您将应用相同的过滤器,结果将是相同的. Here是Eqaulize Histogram的文档.为了应用FFT滤波器,我使用了ImageJ,它是Java库.你可以尝试找到类似于这个库的东西,比如this.
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);
编辑3:以下是应用所述过滤器之前和之后检测到的特征的示例.
>没有任何过滤器的SURF:
>使用EH FFT进行SURF:
> ORB与EH FFT:
正如您在SURF算法中所看到的,执行匹配的冗余信息太多.所以我建议你使用ORB算法. ORB的优点还在于它可以自由使用,高效且稳定的图像旋转和缩放.您还可以在应用EH FFT之前平滑图像,以仅在角上检测要素.
Edit4:我还发现了有关FFT的有用信息.根据this topic,FFT是DFT的有效实现.这是here所描述的.这也可能是答案四个your最近的问题.
标签:feature-extraction,c,opencv,image-processing,feature-detection 来源: https://codeday.me/bug/20190825/1719041.html