ORB算法是否依赖于图像分辨率?

7

我正在尝试使用OpenCV来检测和提取图像中的ORB特征。

然而,我得到的图像并没有被标准化(大小不同,分辨率不同等)。

我想知道在提取ORB特征之前是否需要对图像进行标准化,以便能够在图像之间进行匹配?

我知道特征检测是尺度不变的,但我不确定这对于图像分辨率意味着什么(例如,两个大小相同的图像,在另一个上接近或远离1个对象应该会产生匹配,即使它们在图像上具有不同的比例,但如果图像大小不同怎么办?)。

我是否应该根据图像大小调整ORB中的patchSize(例如,如果我有一个800px的图像,并且取一个20px的patchSize,则对于400px的图像,我应该取一个10px的patchSize)?

谢谢。

更新: 我使用高分辨率和低分辨率的不同算法(ORB、SURF和SIFT)来测试它们的行为。在这张图片中,物体的大小都一样,但图像的分辨率不同:

enter image description here

我们可以看到SIFT非常稳定,虽然它的特征很少。SURF在关键点和特征尺度方面也相当稳定。因此,我的猜测是,在低分辨率和高分辨率图像之间进行特征匹配时,使用SIFT和SURF会起作用,但是ORB在低分辨率下具有更大的特征,因此描述符将无法与高分辨率图像中的描述符匹配。

(在高和低分辨率特征提取之间使用了相同的参数)。

因此,如果我们要对不同分辨率的图像进行匹配,使用SIFT或SURF会更好。


虽然ORB是“尺度不变”的,但正如ORB研究论文中所提到的那样,它并不像SURF/SIFT那样健壮。在具有不同分辨率的图像上,您将获得不同的匹配(数量/位置/方向),因此使用补丁大小可能会起作用。 - Rick M.
是的。我尝试使用SIFT/SURF,但不幸的是它们受到专利保护,因此OpenCV会抛出错误,告诉我应该重新编译它并加上OPENCV_USE_NONFREE选项,但由于我是通过pip安装的,所以无法重新编译它。 - whiteShadow
好的,实际上你也可以得到它们,参见此链接 - Rick M.
是的。不幸的是,这需要我编译OpenCV,而我本来想避免这个步骤的。但我想我真的没有选择了。 - whiteShadow
旧的线程,但在这个例子中,我看到SIFT的行为与其他两个相同。 - Léon Pelletier
显示剩余2条评论
1个回答

3
根据OpenCV文档,ORB也使用金字塔来生成多尺度特征。虽然此页面上的细节不清楚。
如果我们看一下ORB论文本身,在第6.1节中提到使用五个不同尺度的图像。但我们仍然不确定是否需要手动计算不同尺度图像上的描述符,或者它已经在OpenCV ORB中实现。
最后,从源代码(我写这篇答案时为第1063行),我们看到用于关键点/描述符提取的具有不同分辨率的图像。如果您跟踪变量,您会发现ORB类的比例因子可以通过getScaleFactor方法访问。

简而言之,ORB试图自行在不同的尺度上执行匹配。


我认为你所指的比例因子是高斯金字塔中图像缩放之间的比率。但是,如果我使用1600x1600px和800x800px拍摄同一张图片,我认为我得到的特征将不会相同。 - whiteShadow
这就是为什么我说“尝试执行”的原因。当然,根据您的分辨率,您会得到不同的关键点。调整图像大小的方法也是一个重要因素(线性、双三次等)。如果您跟随源代码中的变量,您会发现所提到的比例用于调整图像大小,它调用了getScale函数,该函数取决于比例因子。 - unlut

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接