以下面的扫描图像为例:
通过查看边框,您可以清楚地看到它向左略微旋转。如何检测此旋转量? (为了解决它)
边缘检测会突出显示"边界,但除了尝试许多旋转和建立x- / y-直方图我不知道如何使用这些信息。对于这样一个简单的问题,迭代方法似乎比计算密集程度更高。
我正在寻找伪代码/算法的想法。因此,我没有用编程语言标记这个问题。但是,如果你想提供代码,我更喜欢Python。
答案 0 :(得分:2)
以下方法如何(假设旋转量很小并且文档中确实有足够的水平/垂直线特征):
对于3.,可以在没有任何RANSAC的情况下开始(只适合所有水平/垂直线的最佳旋转),只有在需要注意的明显错误时才添加它。
关于将旋转拟合到线,可以使用单位2D矢量n
和标量d
s.t来参数化每一行。 2D点M
属于iff n . M + d = 0
行。向量n
给出了线的方向,并且基于分类,预计接近参考向量n_0
(e_x
,-e_x
,e_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非常适合普通文本文档。它不适用于图像,也不适用于给定的示例。