其他分享
首页 > 其他分享> > c – 如何改进opencv中的功能检测

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