特征检测和匹配 - 视网膜图像

时间:2014-06-18 21:05:45

标签: c++ matlab opencv

我想使用OpenCV自动注册两个眼底(视网膜)图像。我已经使用我从每个图像手动选择的控制点在Matlab中完成了注册。这种方法非常有效,我通过仿射变换和非线性方法获得了非常好的结果,例如二阶和三次多项式变换。

关于我的眼底图像的更多信息:这两个图像有时会有非常不同的对比度,并且会被大值旋转和翻译。关于翻译/轮换,我无能为力;这就是数据集的方式。

到目前为止我在OpenCV中尝试的是我尝试了各种功能检测器和描述符来提取我的关键点并找到匹配项。但是,由于我的图像对比度较低,有时我根本不会获得匹配(这几乎总是如此)。

如果我之前没有这样做,我想知道是否有一些我应该继续努力的想法?任何有用的指针/提示也会有很长的路要走。谢谢!

这些是我尝试过的功能检测器:SIFT, SURF, MSER, ORB, and FAST

这些是我尝试过的功能描述符:FREAK, SURF, BRIEF, ORB, and FAST

我的输出示例如下所示:

编辑:原始图片的链接: Image1 Image 2

编辑:此图像并排显示两个输入图像。 out

编辑:此图像显示应用ORB特征检测器和FREAK特征描述符后两个图像之间的匹配。比赛很糟糕。 (明显) out2

1 个答案:

答案 0 :(得分:0)

  • 您肯定应该在描述符中包含SIFT。它是首选描述符。

  • 使用任何探测器和描述符,您将在匹配中拥有相当多的异常值。因此,以稳健的方式估计任何变换是很重要的。在这里,在大多数情况下运行良好的解决方案是RANSAC。 OpenCV中提供了RANSAC实现。

更新

您的图像与普通(照片)图像完全不同。

即便对我来说,很难说图像对是如何变换的。当我看到它时,我会看到较长的线条及其分支,而不是小块。所以,我不希望算法做到这一点。


我试验了探测器中可用的参数。

对于SIFT,我们会对其进行描述并找到here(Matlab vl_feat)。特别是,我会查看edge_thresholdpeak_threshold,并可能使用-1th octave对图像进行过采样。

在OpenCV中,documentation提供以下参数,所有这些参数都要更改,以便更多检测。

  • nfeatures - 要保留的最佳功能的数量。这些特征按其分数排序(在SIFT算法中测量为局部对比度)
  • OctaveLayers - 每个八度音程中的层数。 3是D. Lowe纸中使用的值。八度的数量是从图像分辨率自动计算的。
  • contrastThreshold - 用于滤除半均匀(低对比度)区域中的弱特征的对比度阈值。阈值越大,探测器产生的特征就越少。
  • edgeThreshold - 用于过滤掉类似边缘特征的阈值。请注意,其含义与contrastThreshold不同,即edgeThreshold越大,滤出的特征越少(保留更多特征)。
  • sigma - 高斯的西格玛应用于八度#0的输入图像。如果使用带有软镜头的弱相机拍摄图像,则可能需要减少数量。

另一种想法

Efros'有一篇论文。他们描述可能适合您的问题的描述符的组。描述符本质上是几何的。它们占用一个兴趣点,然后使用它周围的四个最近邻居来计算描述符。这四个点形成两个三角形,三角形区域的比率成为描述符。我必须找到论文了解详情。