Image processing 检测文本方向

Image processing 检测文本方向,image-processing,text,Image Processing,Text,如何检测图像中的文本方向 方向是否颠倒(180度)无关紧要。。但是如果文本线是垂直的(90度或270度),我需要将其旋转90度 我希望在没有OCR的情况下这是可能的,因为在同一图像的4个不同方向上处理OCR需要太多的资源 原因是我在数码相机或智能手机的图像上使用scantailor,如果文本方向为90度或270度,有时图像会被裁剪,文本会丢失您可以使用检测图像中最长的线条,然后找到这些线条的主要坡度。如果坡度接近零,则文本是水平的;如果接近无穷大,则文本是垂直的 您没有提到是否使用库来实现这一点

如何检测图像中的文本方向

方向是否颠倒(180度)无关紧要。。但是如果文本线是垂直的(90度或270度),我需要将其旋转90度

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

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

您可以使用检测图像中最长的线条,然后找到这些线条的主要坡度。如果坡度接近零,则文本是水平的;如果接近无穷大,则文本是垂直的

您没有提到是否使用库来实现这一点,但在OpenCV中您可以使用。我在以下网站上找到的图像上使用了此选项:

要获取此图像,请执行以下操作:

然后我旋转原始图像:

要获得此信息:

因为您只对水平或垂直感兴趣,所以只需测试直线端点的x坐标差是否接近零(垂直)或y坐标差是否接近零(水平)

建议的解决方案(Hough变换)很好(我对它投了更高的票),但它可能会占用大量CPU。 下面是一个快速解决方案:

  • 只需计算一个水平投影(每个像素行中像素的亮度之和)。它应该清楚地标记文本行的位置(额外的好处:您可以将文本分割成行)。做大津二值化,以清楚地看到分区
  • 将图像旋转90度,然后重复步骤1。如果现在文本行垂直于像素行,则投影的结果应该是模糊的混乱(文本行没有清晰的分区(好处:此分区将标记页面的边框,如果文本按列排列,您将获得列的结构)
  • 现在,您只需确定哪个投影(步骤1或步骤2)表示真实文本行。您可以计算ob BLOB的数量(一维BLOB-因此处理速度非常快),然后选择BLOB较多的投影(行多于文本列)。或者,您可以只计算每个投影向量的标准偏差,然后取“std”较高的一个。这会更快
  • 如果文本清晰地显示为0度或90度,以上所有方法都适用。如果文本旋转10度,则两个投影都将返回一个混乱。在这种情况下,您可以将文档剪切为5x5块(25块),对每一块执行步骤1、2、3,并根据多数选择决策
  • 注意:所描述的解决方案比Hough变换精度稍低,但非常容易实现,速度极快(整个处理过程比仅仅计算图像的导数要快)+您将免费获得文本行的方向+将文档划分为行和列

    祝你好运

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

    重新导入
    进口撇渣
    导入pytesseract
    img_path='/home/name/Pictures/Screenshot from 2019-03-21 13-33-54(副本).png'
    im=skimage.io.imread(img\u路径)
    newdata=pytesseract.image_to_osd(im,nice=1)
    
    搜索(“(?我成功使用的一种技术是使用Radon变换。您可以在python中找到一个实现示例。您还可以使用获得的投影来检测行距。上面的python实现还显示了如何执行