如何找到图像的旋转角度?

时间:2012-11-14 21:06:13

标签: c# .net algorithm math image-processing

我正在将Bitmap图像输入到我的C#程序中,以便能够执行OCR来识别图像中的字符。如果图像没有旋转,我可以做得很好。但是,程序要求之一是程序自动确定图像是否已旋转,并自动校正这些旋转。

我尝试过一种简单的方法,在图像上跟踪线条并记录与角色接触的点,然后对线点进行简单的线性回归。这在一定程度上起作用,尽管由于角色的弯曲等原因尚未证明它非常准确。

我想知道是否有更好的方法来解决这个问题?提前谢谢了! :)

6 个答案:

答案 0 :(得分:2)

这是一个有趣的问题。我会找一些更易于说明轮换的字母。例如,大写A或R或K应该使两个下部大致相同的水平面。另一种选择是采用无法识别的字母并以各种方式旋转它们并重新尝试识别它们。如果在旋转时可以识别出原始扫描中无法识别的字母,那么这是一个非常大的线索。一旦确定了将不可识别字符变为可识别字符的“校正”旋转,则将相同的旋转值应用于其他字符。

答案 1 :(得分:2)

如果它识别文本行,则尝试模糊图像,使线条大部分为实线并找到线条的方向(通过傅立叶变换分析或脊线检测)。

答案 2 :(得分:2)

我使用gmseDeskew算法来校正程序中的图像。它运作得很好。

答案 3 :(得分:1)

如果文本的格式类似于打印文档(列和文本行),那么您可以利用此功能。

我经常看到用于文档文本的方法是进行投影配置文件:

  1. 以特定方向扫描文档并总结每条扫描线上的“黑色”像素数(创建1D计数数组,每个索引代表Y坐标,配置文件)。
  2. 计算计数的差异(个人资料)。
  3. 重复多个角度,(可以二进制搜索方式完成以减少处理)
  4. 导致最大方差的角度是正确的角度(由于文本行从打印文本中创建大峰,而由于行之间没有文本而导致低谷)
  5. 然后在找到这个角度后,你可以相应地调整你的图像并做你真棒的OCR。

答案 4 :(得分:0)

可能更容易找到与文本相邻的垂直线(即左边距)。对于每条扫描线,记录第一个黑色像素。将所有这些放在线性回归中,你应该得到一个接近垂直的线。从真正的垂直方向测量它的角度,你应该能够解开文本。你可以想象对于顶部,底部和右侧做同样的事情,并采取平均值。

答案 5 :(得分:0)

我们之前遇到过类似的问题,我们搜索了一个简单快捷的解决方案,最后我们使用了商业工具包(leadtools)。您可以使用它在OCR之前对图像进行自动处理。您可以查看此help topic以了解如何使用此工具包处理和扫描图像。