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

标签 c++ matlab opencv

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

关于我的眼 basemap 像的更多信息:两幅图像有时具有非常不同的对比度,并且旋转和平移了很大的值。对于平移/旋转,我无能为力;这就是数据集的方式。

到目前为止,我在 OpenCV 中尝试过的是我尝试了各种可用的特征检测器和描述符来提取我的关键点并找到匹配项。然而,由于我的图像对比度较低,有时我根本无法获得匹配(几乎总是如此)。

我想知道如果我以前没有做过,是否有一些特别的想法我应该去研究?任何有用的指示/提示也会有很长的路要走。谢谢!

这些是我尝试过的特征检测器:SIFT、SURF、MSER、ORB 和 FAST

这些是我尝试过的特征描述符:FREAK、SURF、BRIEF、ORB 和 FAST

我的输出示例如下所示:

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

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

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

最佳答案

  • 您绝对应该在描述符中包含 SIFT。这是首选描述符。

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

更新

您的图像与普通(摄影)图像完全不同。

即使对我来说,也很难说出图像对是如何转换的。当我看到它时,我会看更长的线条和它们的分支,而不是小块。所以,我不希望算法能够做到这一点。


我会试验检测器中可用的参数。

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

在 OpenCV 中 documentation提供以下参数,您可以更改所有这些参数以获得更多检测。

  • nfeatures – 要保留的最佳特征的数量。特征按分数排序(在 SIFT 算法中测量为局部对比度)
  • OctaveLayers – 每个 Octave 音程中的层数。 3 是 D. Lowe 论文中使用的值。倍频程数是根据图像分辨率自动计算的。
  • contrastThreshold – 对比度阈值,用于过滤掉半均匀(低对比度)区域中的弱特征。阈值越大,检测器产生的特征越少。
  • edgeThreshold – 用于过滤掉类似边缘的特征的阈值。注意其含义与contrastThreshold不同,即edgeThreshold越大,过滤掉的特征越少(保留的特征越多)。
  • sigma – 在 Octave 音阶 #0 处应用于输入图像的高斯 sigma。如果您的图像是使用带有软镜头的弱相机拍摄的,您可能希望减少数量。

另一个想法

Efros 小组在一篇论文中描述了一个可能适合您的问题的描述符。描述符本质上是几何的。他们取一个兴趣点,然后使用它周围的四个最近邻居来计算描述符。这四个点组成两个三角形,三角形的面积比成为描述符。我得去找论文了解详情。

关于c++ - 特征检测和匹配 - 视网膜图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24295006/

相关文章:

c++ - 临时 const 数组未绑定(bind)到右值引用

c++ - 将 C++ 变量声明为 const 是有助于还是损害性能?

c++ - 如何在 C++ 中创建高效的二维网格?

c++ - 通过矩阵转置优化矩阵乘法

matlab - 提取边界内的图像区域

matlab - MATLAB ks密度函数是否执行边界校正?

matlab - Matlab 中的异常与错误

opencv - 从指定的起点和终点剪辑 C++ OpenCV 中的视频

C++/OpenCV : How to use BOWImgDescriptorExtractor to determine which clusters relate to which images in the vocabulary?

python - 在python中的图像中插入波斯文字,UnicodeEncodeError: 'latin-1'编解码器无法在位置0-4处编码字符:序数不在范围内(256)