对齐一页文本的2张重叠照片

时间:2015-01-13 19:02:39

标签: opencv text feature-extraction

我有2张文字图片,其中第一张图片的右侧与第二张图片的左侧重叠(从左到右拍摄同一页文字的2张部分照片)。 我想缝合图像,我正在尝试一种功能匹配的方法。 我已尝试使用来自OpenCV网站http://docs.opencv.org/trunk/doc/py_tutorials/py_feature2d/py_matcher/py_matcher.html#matcher

的ORB功能搜索+强力功能匹配的示例

在我的情况下完全关闭(找不到任何正确的匹配,所有误报)至少使用功能搜索的默认参数。如果它使用了角落,那么在文本的情况下它会很难。

如何通过功能匹配更可靠地匹配此类图像和文本?我应该为ORB搜索算法指定一些不同的非默认参数吗?使用不同的算法和不同的参数?

如果没有特征匹配,我可以使用其他方法与Open CV进行此对齐吗?

Mat p1 = new Mat("part1.jpg", LoadMode.GrayScale);
Mat p2 = new Mat("part2.jpg", LoadMode.GrayScale);

var orb = new ORB();

Mat ds1;
var kp1 = DetectAndCompute(orb, p1, out ds1);

Mat ds2;
var kp2 = DetectAndCompute(orb, p2, out ds2);

var bfMatcher = new BFMatcher(NormType.Hamming, crossCheck: true);
var matches = bfMatcher.Match(ds1, ds1);

var tenBestMatches = matches.OrderBy(x => x.Distance).Take(10);

var res = new Mat();
Cv2.DrawMatches(p1, kp1, p2, kp2, tenBestMatches, res, flags: DrawMatchesFlags.DrawRichKeypoints);


using (new Window("result", WindowMode.ExpandedGui, res))
{
    Cv2.WaitKey();
}

private static KeyPoint[] DetectAndCompute(ORB orb, Mat p1, out Mat ds1)
{
    var kp1 = orb.Detect(p1);
    ds1 = new Mat();
    orb.Compute(p1, ref kp1, ds1);
    return kp1;
}

image description

1 个答案:

答案 0 :(得分:1)

有趣的问题。关于ORB方法我想到的是,由于我们正在尝试处理的主题(纸上印刷的字母),它可能导致许多误报。首先,我们要检测可能的特征的复杂性 - 各种字符组合在一起,与特征尺寸相比相对较小。增加特征的大小会迅速增加它们的可能数量。其次,你可以在属于不同单词的某个单词的开头检测到相同的字母,这样你就不能单独依赖每个检测到的匹配,而不是将信息组合在一起。一般来说,我会尝试调整一个orb探测器补丁大小(C++ case),试图平衡它的大小。并尝试SIFT或SURF,也许他们会在你的情况下有更好的结果。

另一种方法,绝对是蛮力。根据您提供的示例,应该可以检测单独的单词(阈值处理 - > blob检测)。因此,让我们假设我们已经检测到带有单词的blob。假设我们有一些设置A和B,分别从左右图像中检测到的单词。然后我们应该找到A x B中每对单词的函数overlap()的最大值:

  

pos = arg_max {(a,b)in A x B:重叠(a,b)}

重叠函数是任何带有两个图像和anc计算其相似性的函数。你可以在那里使用例如直方图比较,绝对差值之和(wiki)或任何能够平衡准确度和性能的模板匹配算法。比较两个单词的图像时,它应该对平移,缩放和旋转不变,这也会增加复杂性。

一般来说,问题并不容易,因此研究很有趣。