cla*_*rkk 8 text image-processing
如何检测图像中的文字方向?
如果方向是倒置的(180度)也没关系.但是如果文本线是垂直的(90度或270度),我需要将其旋转90度.
我希望它没有OCR可能,因为在同一图像的4个不同方向上处理OCR需要太多资源
原因是我在数码相机或智能手机的图像上使用了scantailor,如果文字方向是90度或270度,有时会裁剪图像并丢失文字
Dan*_*HsH 10
提出的解决方案(霍夫变换)很好(我赞成它)但它可能是CPU密集型的.这是一个快速的脏解决方案:
注意:所描述的解决方案比Hough变换稍微准确一些,但它非常容易实现,速度极快(整个处理比计算图像的导数更快)+你将免费获得文本行的方向+分区将文档分为行和列.
祝好运
对步骤1的补充和澄清:第一步的说明.假设您的图像宽度为"W",高度为"H",白色背景上为黑色文本.通过水平投影,您可以对每行中的像素值求和.结果是长度为"H"的向量.不包含文本任何部分(因此位于文本行之间)的像素行将产生高投影值(因为背景为白色 - 255).包含字母部分的像素行将产生较低的投影值.所以现在你有了长度为H的向量,你想看看里面是否有一个明确的值分区.一组高值,而不是一组低值等(如斑马条纹).示例:如果文本行之间的距离为20像素,并且每个字母的高度为16像素,则您希望投影向量具有20个大值,后跟16个低数字,后跟20个高值,16个低值等.当然,文档不理想,每个字母都有不同的高度,有些有空洞:(比如't'和'q','i')但是分区的一般规则都有.相反,如果您将文档旋转90度,现在您的求和与文本行不对齐 - 结果向量将只有大致随机的"H"值,而没有明确的分组.现在您需要做的就是确定结果向量是否具有良好的分区.一种快速的方法是计算值的标准偏差.如果有分区 - std会很高,否则会更低.另一种方法是对投影矢量进行二值化处理,将其视为1xH大小的新图像,午餐连通分量分析并提取斑点.这非常快,因为斑点是一维的.因此,明亮的斑点将大致标记文本行之间的区域,暗孔标记文本行.如果你的总和是好的(矢量有一个明确的分区) - 你将有很少的大斑点(blob的数量〜大致作为线的数量和blob的中值长度〜大致与文本行之间的距离).但如果你的总和是错误的(文件旋转了90度) - 你会得到许多随机的斑点.连通分量分析需要更多代码(与std相比),但它可以为您提供文本行的位置.线'i'将介于blob'i'和blob'i + 1'之间
您可以使用霍夫变换来检测图像中最长的线条,然后找到这些线条的主要斜率。如果斜率接近零,则您的文本为水平;如果接近无穷大,则您的文字是垂直的。
您没有提到是否使用库来执行此操作,但是在OpenCV中,您可以使用HoughLinesP。我在wikimedia上的图像上使用了本教程:
获得此图像:
然后我旋转了原始图像:
得到这个:
由于您只对水平或垂直感兴趣,因此可以仅测试线端点的x坐标差接近零(垂直)还是y坐标差接近零(水平)。
我成功使用的一项技术是使用氡变换。您可以在此处找到python实现的示例。您还可以使用获得的投影来检测行距。上面的 python 实现也展示了如何做到这一点。
\n直观的解释是这样的。为此,我们使用灰度图像。想象一下,您有一个光源,以及某种计算接触表面(探测器)的光线数量的方法。现在想象一下页面中的每个字符都充当一堵墙,吸收一些穿过的光线。然后,如果您以一定角度在页面平面上照射光线,并将探测器放在另一侧,您可以看到,只有当光线照射在文本的行之间时,您才会获得最大的光线。因此,我们的想法是围绕页面旋转光源 180\xc2\xb0,探测器捕获最多光线的角度就是文本的角度。直观地说,这就是氡变换的工作原理。
\n\n有关氡变换的技术解释,请参阅维基百科或其他来源。
该技术允许您非常精确地检测 0\xc2\xb0 和 180\xc2\xb0 之间文本的旋转(它无法检测文本是否颠倒),具体取决于 180\xc2\xb0 有多少“增量” xc2\xb0 旋转你尝试一下。当然,更高的精度(增量)也会增加处理时间。对于您的用例,由于您已经知道文本处于 90\xc2\xb0 角度,因此您可以尝试 90\xc2\xb0 的两个增量,这应该相当快。
\n那么你需要使用另一种技术来检测它是否颠倒。
\n