如何检测图像中的文字方向?

方向是否上下颠倒(180度)都没有关系。但是,如果文本行是垂直的(90度或270度),则需要将其旋转90度。

我希望没有OCR的情况也可以实现,因为在同一张图片的4个不同方向上需要花费太多资源来处理OCR

原因是我在数码相机或智能手机上的图像上使用了scantailor,并且如果文本方向为90或270度,则有时会裁切图像并且丢失文本

最佳答案

提出的解决方案(Hough变换)很好(我赞成),但可能会占用大量CPU。
这是一个快速的肮脏的解决方案:


只需计算水平投影(将每个像素行中像素的亮度求和即可)。它应该清楚地标记文本行的位置(注意:将文本划分为行)。进行otsu二值化以清楚地看到分区。
将图像旋转90度并重复步骤1。如果现在文本行与像素行垂直,则投影结果应该只是一团乱麻(没有清晰的文本行分区(奖金:此分区将标记边框)页面,如果文本按列排列,您将获得列的结构)。
现在,您只需确定哪个投影(第1步或第2步)代表真实文本行。您可以计算ob blob的数量(一维blob,因此处理速度非常快),然后选择blob较多的行(行数多于文本列)。另外,您也可以只计算每个投影矢量的标准偏差,然后取较高“ std”的标准偏差。这甚至更快。
如果文本在0度或90度处清晰可见,则上述所有条件均成立。如果将其旋转,则说两个投影相差10度将返回混乱。在这种情况下,您可以将文档切成5x5片(25片),在每片上执行步骤1,2,3,然后根据多数选择决定。


注意:所描述的解决方案比Hough变换的精度差一点,但是它实现起来非常容易,非常快(整个处理比仅计算图像的导数要快)+您将免费获得文本行+分区的方向文档分成行和列。

祝好运

步骤1的补充和说明:步骤1的说明。假设您有一个宽度为“ W”和高度为“ H”的图像,并且在白色背景上有一个黑色文本。通过进行水平投影,您可以对每一行中的像素值求和。结果是长度为“ H”的向量。
不包含文本任何部分的像素行(因此位于文本行之间)将产生较高的投影值(因为背景为白色-255)。包含字母部分的像素行将产生较低的投影值。
因此,现在您有了长度为H的向量,并且想要查看其中是否存在清晰的值分区。一组高值,而不是一组低值,等等(如斑马条纹)。例如:如果文本行之间的距离为20像素,并且每个字母的高度为16像素,则您希望投影矢量具有20个大值,然后是16个低数,然后是20个高值,16个低等。当然,该文档这是不理想的,每个字母都有不同的高度,有些字母有孔:(例如“ t”和“ q”,“ i”),但通常采用分区规则。
相反,如果将文档旋转90度,而现在的求和不与文本行对齐-结果向量将仅具有大致随机的“ H”值,而没有清晰地分成几组。
现在,您需要做的就是确定结果向量是否具有良好的分区。
一种快速的方法是计算值的标准偏差。如果有分区,则std会很高,否则会更低。
另一种方法是对投影向量进行二值化处理,将其视为大小为1xH的新图像,进行午餐相关成分分析并提取斑点。这是非常快的,因为斑点是一维的。因此,明亮的斑点将大致标记文本行之间的区域,而深色孔将标记文本行。如果您的求和是好的(向量具有清晰的分区)-您将有几个大的斑点(斑点的数量〜大致相当于行数,斑点的中位长度〜大致等于文本行之间的距离)。但是,如果您的总和是错误的(文档旋转了90度),您将获得许多随机斑点。连接的组件分析需要更多的代码(与std相比),但是它可以为您提供文本行的位置。行“ i”将在blob“ i”和blob“ i + 1”之间

07-28 03:59
查看更多