我正在开发一个应用程序,该应用程序应确定输入图像是否包含图章印记并返回其位置。对于RGB图像,我正在使用颜色分割和进行验证(具有各种形状因子),对于灰度图像,我认为SIFT +验证可以完成这项工作,但是使用SIFT只能找到我在我的工作中得到的那些印记(在输入图像上)数据库中。
在理想的情况下,它的效果非常好,如图所示。
图。 1。 http://i.stack.imgur.com/JHkUl.png
当输入图像包含数据库中不存在的标记时,会出现此问题。我做的第一件事是检查是否有任何匹配的关键点,如果我将相似的标记与输入图像上的标记进行比较。在大多数情况下,没有单个匹配的关键点,如果有一些关键点,他们宁愿引用输入图像的其他部分而不是图章,如图2所示:
图。 2。 http://i.stack.imgur.com/coA4l.png
我还尝试在输入图像和圆形图像之间找到匹配,因为图章是圆形的,但圆形图像的关键点很少,如果有的话。
所以我想知道是否有任何不同的方法可以使SIFT在这种情况下更有用?我想创建一个包含我数据库中所有描述符和关键点的矩阵,然后查找输入图像和矩阵之间最接近的欧氏距离,但它可能无法工作,因为数据库中有很多匹配的关键点(不需要的) (见图2)。
我正在使用Matlab并尝试了VLFeat和D. Lowe SIFT实现。
编辑:
所以我找到了一种方法来强制SIFT计算图像上用户定义点的描述符。我的测试图像包含一个圆圈,然后计算描述符并与输入图像进行匹配,包括图1和图2中的描述。这个过程重复从0到10的比例。不幸的是它也没有帮助。
答案 0 :(得分:1)
这只是SIFT问题的第一个暗示,而不是完整的答案。
我的印象是,通过SIFT将圆形图像与圆形图像匹配来检测圆形并不是最好的方法,尤其是当您想要检测的圆形内部有一些未知纹理时。
圆检测的教科书算法是Hough transform,它主要用于线检测,但适用于任何形状,可用少量参数描述(同事告诉我事情变得讨厌上面3,但圆圈只有X,Y和r)。文件交换中有几个implementations,链接只是一个例子。霍夫圆检测要求您在要检测的半径上设置上限,但这对您的应用来说似乎没问题。
从您提供的示例来看,如果您可以可靠地检测圆圈,您应该会走得很远。
答案 1 :(得分:0)
实际上我认为SIFT不会解决这个问题。我已经玩了很长一段时间的SIFT,我的结论是它确定了相同的模式,但不是类似的模式。 只需看看SIFT特征向量的构造:描述符由几个梯度直方图(!)组成。如果数据库中的模式在邮票中有非常类似blob的结构,那么您可能有机会。但如果这不成立,那么我猜你不会很幸运。
从我的角度来看,你已经解决了找到 indentical 对象(邮票)的问题,现在扩展到找到类似的对象。这听起来是一样的,但在我过去的研究中,我发现这些问题只是相关但不太相同。
您的应用程序中是否有任何运行时限制?可能还有其他方法,但在这种情况下,关于可能的约束的更多输入可能是有用的。
有关约束的更新:
所以你的下一个任务可能是检测未知的邮票,对吗?
这听起来像是一项分类任务。
在你的情况下,我会首先尝试找到一个描述符/表示(或SVM),将图像分类为stamp / no-stamp。为了评估这一点,建立一个具有基础事实和合理数量的“未知”邮票和其他图像的数据库,如来自字母的随机快照,不包含邮票。这将是你的测试集。
然后尝试一些描述符/表示来计算图像之间的距离/相似度,以将测试集分类为STAMP / NO-STAMP类。当您找到在分类中表现良好的描述符/距离度量(或SVM)时,您可以在字母上执行滑动窗口方法以查找戳记。滑动窗口方法当然不是一种非常快速的方法,但非常简单。 至少当你达到这一点时,你可以调整检测 - 例如基于有趣的点检测器......但是一步接一个......