C# 如何检测图像方向(文本)

C# 如何检测图像方向(文本),c#,.net,image,image-processing,bitmap,C#,.net,Image,Image Processing,Bitmap,我的程序正在处理存储为单独位图的传真文档 我想知道是否有一种方法可以自动检测页面方向(垂直或水平),以正确的顺序向用户显示图像预览(必要时表示旋转) 非常感谢您的建议 编辑:澄清: 当传真机接收到多页文档时,它会将每页保存为单独的TIFF文件。 我的应用程序有内置的查看器来显示这些文件。所有文件均缩放为A4格式,并以TIFF格式保存(因此不会更改通过高度/宽度参数检测方向) 默认情况下,“我的查看器”以纵向模式显示图像 我想做的是自动检测组织文档以横向模式打印时的情况(如宽幅Excel表格),然

我的程序正在处理存储为单独位图的传真文档
我想知道是否有一种方法可以自动检测页面方向(垂直或水平),以正确的顺序向用户显示图像预览(必要时表示旋转)

非常感谢您的建议

编辑:澄清:
当传真机接收到多页文档时,它会将每页保存为单独的TIFF文件。
我的应用程序有内置的查看器来显示这些文件。所有文件均缩放为A4格式,并以TIFF格式保存(因此不会更改通过高度/宽度参数检测方向)
默认情况下,“我的查看器”以纵向模式显示图像

我想做的是自动检测组织文档以横向模式打印时的情况(如宽幅Excel表格),然后我想为最终用户显示旋转预览,以加快预览过程

显然有4种可能的传真方向纵向/横向x 2种旋转

我甚至对检测组织文档是横向还是纵向的简化解决方案感兴趣(我注意到大多数横向文档需要顺时针旋转)

EDIT2:Idea
我想这可能是某种想法:
若我能画水平线和垂直线,并检查这条线是否不切割任何(黑色)点。然后我们可以比较哪种类型的线条(水平或垂直)和his决定的页面方向。

你觉得怎么样?

你需要OCR。滚动您自己的OCR会有点困难,但可能有图书馆或其他值得研究的东西?此外,即使有好的OCR,它也不是100%可靠的解决方案。

我想知道是否有一些文本属性可以帮助您做到这一点

例如,根据快速浏览,文本中的垂直线(l、j、k、m、n等)远远多于水平线,因此您可以从这一点开始

但即使检测这些也不是很简单,您也需要使用某种过滤器,如
Sobel
Prewitt
。它们都有水平和垂直版本,以获取更多信息

当然,excel电子表格的垂直/水平线是最有力的边缘,因此您必须忽略这些,只查看文本


备选方案:您能否为用户提供一种简单的方式来旋转图像,如Windows Picture viewer中的箭头,或者只显示他们可以单击的4个缩略图预览。您可能需要缓存4个版本(如果您正在旋转),以便速度更快,但前提是速度是个问题?

您可以执行快速傅立叶变换(FFT)将空间图像转换为频率/角度表示。然后找到频率最显著的角度。这听起来很复杂,但并没有那么难,它相当有效,实际上它一次测试了所有可能的角度,而不是一个只适用于特定角度的硬编码黑客。使用数字配方和FFT等搜索术语搜索示例实现。

这是一篇题为“[pdf]

我还没有找到他们工作的实施方案,但这种方法对我来说很好:

提出的方法背后的基本思想很简单

形状分类器根据所有感兴趣的脚本中的字符(类)进行训练。在运行时,分类器在图像中的每个连接组件(CC)上独立运行,并在将每个CC旋转到其他三个候选方向(与输入方向成90°、180°和270°)后重复该过程

该算法跟踪给定方向的每个脚本中估计的字符数,以及所有候选方向的累积分类可信度分数。选择页面方向估计值作为累积可信度最高的估计值,选择脚本估计值作为该脚本中字符数最多的估计值,以获得最佳方向估计值


请澄清。您的意思是说您有一组纵向和横向混合文本页面的图像,并且您希望分析图像以确定如何旋转图像,以便文本以正确的方式向上显示?假设原稿可能被“倒置”扫描,那么实际上可能有4个方向。我就是这样做的。我已经为C#使用了Teseract.NET免费OCR库。旋转文档,只要获得最佳%比率。链接已断开