如何找到文档的轮换?

时间:2017-02-17 09:06:36

标签: computer-vision ocr

以下面的扫描图像为例:

enter image description here

通过查看边框,您可以清楚地看到它向左略微旋转。如何检测此旋转量? (为了解决它)

边缘检测会突出显示"边界,但除了尝试许多旋转和建立x- / y-直方图我不知道如何使用这些信息。对于这样一个简单的问题,迭代方法似乎比计算密集程度更高。

我正在寻找伪代码/算法的想法。因此,我没有用编程语言标记这个问题。但是,如果你想提供代码,我更喜欢Python。

2 个答案:

答案 0 :(得分:2)

以下方法如何(假设旋转量很小并且文档中确实有足够的水平/垂直线特征):

  1. 通过Hough transform
  2. 提取文档中的所有(参数)行
  3. 将线条分类为接近水平或垂直(并简单地丢弃那些不能分类到某个公差的线条),
  4. 稳健地适应旋转,以最大限度地减少线条与预期方向的偏差(RANSAC变体与旋转解算器)。
  5. 对于3.,可以在没有任何RANSAC的情况下开始(只适合所有水平/垂直线的最佳旋转),只有在需要注意的明显错误时才添加它。

    关于将旋转拟合到线,可以使用单位2D矢量n和标量d s.t来参数化每一行。 2D点M属于iff n . M + d = 0行。向量n给出了线的方向,并且基于分类,预计接近参考向量n_0e_x-e_xe_y-e_y取决于实际分类)。因此,可能的目标函数是F(theta) = argmax_theta 1/2 sum_i | ( R(theta) n^i ) . n_0^i |^2,其中theta是要应用的2D旋转的角度,R(theta)对应的2 x 2旋转矩阵。该目标函数找到最大化旋转线矢量和预期线矢量之间的对齐的旋转。如果从目标函数中删除了正方形,则目标函数实际上归结为2D中的简化Kabsch algorithm /绝对方向,无需转换/缩放,可以使用SVD求解。

答案 1 :(得分:0)

deskew package非常适合普通文本文档。它不适用于图像,也不适用于给定的示例。