检测文字方向

时间:2014-05-21 12:23:38

标签: image-processing text

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

如果方向是颠倒的(180度)也没关系。但如果文字线是垂直的(90度或270度),我需要将其旋转90度。

我希望没有OCR可能,因为在同一图像的4个不同方向上处理OCR需要太多资源

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

4 个答案:

答案 0 :(得分:8)

建议的解决方案(Hough变换)很好(我赞成它)但它可能是CPU密集型的。 这是一个快速的肮脏解决方案:

  1. 只计算水平投影(将每个像素行中像素的亮度相加)。它应该清楚地标记文本行的位置(奖励:你得到文本的分区到行)。做otsu二值化以清楚地看到分区。
  2. 将图像旋转90度并重复步骤1.如果现在文本行垂直于像素行,则投影结果应该是模糊的混乱(没有明确的文本行分区(奖励:此分区将标记)页面的边框,如果文本按列排列,您将获得列的结构。
  3. 现在您只需确定哪个投影(步骤1或步骤2)代表真实文本行。你可以计算ob blobs的数量(一维blob - 所以处理速度非常快)并选择一个blob更多的行(行数多于文本列)。或者,您可以只计算每个投影向量的标准偏差,并选择具有较高“标准”的标准偏差。这甚至要快得多。
  4. 如果文字清晰地显示在0度或90度,则以上所有内容都成立。如果它旋转,比说两个投影都会返回10度。在这种情况下,您可以将文档剪切为5x5件(25件),对每件作品执行步骤1,2,3并根据大多数人选择决定。
  5. 注意:所描述的解决方案比Hough变换准确性稍差,但它非常容易实现,速度极快(整个处理比计算图像的衍生物更快)+你会得到的免费的文本行的方向+文档的分区为行和&列。

    祝你好运

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

答案 1 :(得分:4)

您可以使用Hough Transform检测图像中最长的线条,然后找到这些线条的主要斜率。如果斜率接近零,则文本为水平;如果它接近无穷大,那么你的文字是垂直的。

您没有提及是否使用库来执行此操作,但在OpenCV中您可以使用HoughLinesP。我在tutorial上找到的图片上使用了wikimedia

horizontal text

获取此图片:

horizontal output

然后我旋转原始图像:

vertical text

得到这个:

enter image description here

由于您只对水平或垂直感兴趣,您可以测试线端点的x坐标的差异是接近零(垂直)还是y坐标的差异接近于零(水平)。

答案 2 :(得分:0)

在Python下,您可以使用pytesseract执行以下操作:

import re
import skimage
import pytesseract
img_path = '/home/name/Pictures/Screenshot from 2019-03-21 13-33-54 (copy).png'
im = skimage.io.imread(img_path)
newdata = pytesseract.image_to_osd(im, nice=1)
re.search('(?<=Rotate: )\d+', newdata).group(0)

希望这还是有帮助的!

答案 3 :(得分:0)

我成功使用的一种技术是使用Radon变换。您可以在python中找到实现here的示例。您还可以使用获得的投影来检测行距。上面的python实现还展示了如何做到这一点。

直观的解释是这样的。为此,我们使用灰度图像。假设您有一个光源,并且以某种方式计算了接触表面(检测器)的光线的数量。现在,想象页面中的每个字符都充当一堵墙,吸收一些穿过的光。然后,如果您以一定角度在页面平面中发光,然后将检测器放在另一侧,则可以看到只有当文本在两行之间发光时,您才能获得最大的光线。因此,想法是将光源围绕页面旋转180°,检测器捕获最多光线的角度就是文本的角度。直观地讲,这就是ra变换的工作原理。

enter image description here 有关radon变换的技术说明,请参见wikipedia或其他来源。

此技术使您可以非常精确地检测到文本的旋转,旋转角度为180°的倍数,具体取决于您尝试的180°旋转的“增量”是多少。当然,更高的精度(增量)也会增加处理时间。对于您的用例,由于您已经知道文本成90°角,因此可以尝试两个90°的增量,这应该很快。

然后,您需要使用另一种技术来检测它是否颠倒了。