我将位图图像输入到我的 C# 程序中,以便能够执行 OCR 来识别图像中的字符。如果图像不旋转,我可以做得很好。然而,程序要求之一是程序自动确定图像是否已旋转,并自动纠正这些旋转。
我尝试实现一种简单的方法,在图像上跟踪线条并记录与字符接触的点,然后对线条点执行简单的线性回归。这在一定程度上是有效的,尽管由于字符的弯曲等原因,它还没有被证明非常准确。
我想知道是否有更好的方法来解决这个问题?提前谢谢了!:)
我将位图图像输入到我的 C# 程序中,以便能够执行 OCR 来识别图像中的字符。如果图像不旋转,我可以做得很好。然而,程序要求之一是程序自动确定图像是否已旋转,并自动纠正这些旋转。
我尝试实现一种简单的方法,在图像上跟踪线条并记录与字符接触的点,然后对线条点执行简单的线性回归。这在一定程度上是有效的,尽管由于字符的弯曲等原因,它还没有被证明非常准确。
我想知道是否有更好的方法来解决这个问题?提前谢谢了!:)
可以肯定的是,这是一个有趣的问题。我会寻找某些更容易轮换的字母。例如,大写字母 A 或 R 或 K 的下半部分应大致位于同一水平面。另一种选择是获取无法识别的字母并以各种方式轮换它们并重新尝试识别它们。如果在旋转时可以识别原始扫描中无法识别的字母,那是一个很大的线索。一旦您确定了使不可识别字符变为可识别字符的“校正”旋转,请将相同的旋转值应用于其他字符。
如果它识别出文本行,则尝试模糊图像,使线条大部分是实心的,并找到线条的方向(通过傅里叶变换分析或脊线检测)。
我使用gmseDeskew算法在我的程序中对图像进行纠偏。它工作得很好。
如果文本的格式类似于打印文档(列和文本行),那么您可以利用这一点。
我经常看到用于文档文本的一种方法是进行投影配置文件:
然后在找到这个角度后,您可以相应地调整图像并进行出色的 OCR。
我们之前也遇到过类似的问题,我们搜索了一个简单快捷的解决方案,最终我们使用了一个商业工具包(leadtools)。您可以使用它在 OCR 之前对图像进行自动处理。您可以查看此帮助主题以了解如何使用此工具包来处理和扫描图像。
可能更容易找到与文本相邻的垂直线(即左边距)。对于每条扫描线,记录第一个黑色像素。将所有这些放在线性回归中,你应该得到一条接近垂直的线。从真正的垂直方向测量其角度,您应该能够取消旋转文本。你可以想象对顶部、底部和右侧也做同样的事情,然后取平均值。