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

C# 如何找到图像的旋转角度?,c#,.net,algorithm,math,image-processing,C#,.net,Algorithm,Math,Image Processing,我将位图图像输入到我的C#程序中,以便能够执行OCR来识别图像中的字符。如果图像没有旋转,我可以做得很好。然而,程序要求之一是程序自动确定图像是否已旋转,并自动纠正这些旋转 我尝试过实现一种简单的方法,即在图像上跟踪线条,记录与角色接触的点,然后对线条点执行简单的线性回归。这在一定程度上是可行的,尽管由于字符的曲率等原因,它还没有被证明是非常准确的 我想知道是否有更好的方法来解决这个问题?非常感谢!:) 这确实是一个有趣的问题。我会寻找一些更容易辨认的字母。例如,大写字母a、R或K的两个下部应大

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

我尝试过实现一种简单的方法,即在图像上跟踪线条,记录与角色接触的点,然后对线条点执行简单的线性回归。这在一定程度上是可行的,尽管由于字符的曲率等原因,它还没有被证明是非常准确的


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

这确实是一个有趣的问题。我会寻找一些更容易辨认的字母。例如,大写字母a、R或K的两个下部应大致位于同一水平面上。另一种选择是,提取无法识别的字母,并以各种方式旋转它们,然后重新尝试识别它们。如果在原始扫描中无法识别的字母可以在旋转时识别,这是一个相当大的线索。一旦确定了将不可识别字符转换为可识别字符的“校正”旋转,请将相同的旋转值应用于其他字符。

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

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

如果文本格式类似于打印文档(一列或多行文本),则您可以利用此功能

我经常看到用于文档文本的一种方法是创建投影配置文件:

  • 以特定方向扫描文档,并计算每一扫描线上的“黑色”像素数(创建1D计数数组,每个索引表示Y坐标,轮廓)
  • 计算计数(配置文件)的方差
  • 重复多个角度,(可以以二进制搜索方式进行,以减少处理)
  • 导致最大差异的角度是正确的角度(因为文本行从打印文本中产生较大的峰值,而由于行之间没有文本而产生较低的谷值)

  • 找到这个角度后,你可以相应地调整你的图像,并进行出色的OCR。

    我使用算法在我的程序中对图像进行反扭曲。它工作得非常好。

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

    如果您可以找到,请添加此项,例如“o”,你可以向一个方向放射状地延伸,通过查看字母是否在你的线条上,很容易确定你的方向。最大的问题是,我发现在旋转之前很难(如果不是不可能的话)隔离字符,因为我在寻找字符之间的垂直和水平空白。如果图像旋转,该空白通常会被下一个字符打断。因为我无法分离字符,所以我无法开始尝试识别它们。@MacSigler如何使用足够强的模糊,使文本行至少混合在一起,以便进行边缘检测或在hough变换中脱颖而出?@MacSigler这可能help@AK4749这确实是一篇有趣的论文,但每次我试着读它的时候,我都会迷路这个算法帮了我的忙。我发现了一个很好的C#实现,不幸的是,所编写的算法似乎是针对±20度的硬编码。我尝试更改代码行,例如
    double-cAlphaStart=-20改为-45,搜索±45度,以及其他一些行,但不可避免地会有东西断裂。我很想知道是否有更灵活的算法,或者有人可以解释如何在不破坏结果的情况下调整算法,使其更灵活。我也尝试过,效果很好@MacSigler将角度“范围”增加到(-45,+45),似乎您只需更改线条:double cAlphaStart=-45;int cSteps=90*5;我测试得很快,但似乎还可以。虽然这个链接可以回答这个问题,但最好在这里包含答案的基本部分(以及为什么它实际上回答了旋转角度的问题),并提供链接供参考。如果链接页面发生更改,仅链接的答案可能无效(并被否决)。看看为什么它很重要。