我想使用 OpenCV 自动配准两张眼底(视网膜)图像。我已经使用从每个图像中手动选择的控制点在 Matlab 中完成了配准。这种方法非常有效,我通过仿射变换和非线性方法(例如二阶和三次多项式变换)获得了非常好的结果。
关于我的眼 basemap 像的更多信息:两幅图像有时具有非常不同的对比度,并且旋转和平移了很大的值。对于平移/旋转,我无能为力;这就是数据集的方式。
到目前为止,我在 OpenCV 中尝试过的是我尝试了各种可用的特征检测器和描述符来提取我的关键点并找到匹配项。然而,由于我的图像对比度较低,有时我根本无法获得匹配(几乎总是如此)。
我想知道如果我以前没有做过,是否有一些特别的想法我应该去研究?任何有用的指示/提示也会有很长的路要走。谢谢!
这些是我尝试过的特征检测器:SIFT、SURF、MSER、ORB 和 FAST
这些是我尝试过的特征描述符:FREAK、SURF、BRIEF、ORB 和 FAST
我的输出示例如下所示:
编辑: 此图像并排显示了两个输入图像。
编辑:这张图片显示了应用 ORB 特征检测器和 FREAK 特征描述符后两张图片之间的匹配。比赛很糟糕。 (明显地)
最佳答案
您绝对应该在描述符中包含 SIFT。这是首选描述符。
使用任何检测器和描述符,您在匹配时都会有相当多的离群值。因此,以稳健的方式估计任何转换很重要。在这里,在大多数情况下运行良好的解决方案是 RANSAC。 OpenCV 中提供了 RANSAC 实现。
更新
您的图像与普通(摄影)图像完全不同。
即使对我来说,也很难说出图像对是如何转换的。当我看到它时,我会看更长的线条和它们的分支,而不是小块。所以,我不希望算法能够做到这一点。
我会试验检测器中可用的参数。
对于 SIFT,这些已被描述并且可以找到 here (Matlab vl_feat)。特别是,我会查看 edge_threshold
和 peak_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/