如何检测图像中的文字方向?
如果方向是颠倒的(180度)也没关系。但如果文字线是垂直的(90度或270度),我需要将其旋转90度。
我希望没有OCR可能,因为在同一图像的4个不同方向上处理OCR需要太多资源
原因是我在数码相机或智能手机的图像上使用了scantailor,如果文字方向是90度或270度,有时会裁剪图像并丢失文字
答案 0 :(得分:8)
建议的解决方案(Hough变换)很好(我赞成它)但它可能是CPU密集型的。 这是一个快速的肮脏解决方案:
注意:所描述的解决方案比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:
获取此图片:
然后我旋转原始图像:
得到这个:
由于您只对水平或垂直感兴趣,您可以测试线端点的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变换的工作原理。
有关radon变换的技术说明,请参见wikipedia或其他来源。
此技术使您可以非常精确地检测到文本的旋转,旋转角度为180°的倍数,具体取决于您尝试的180°旋转的“增量”是多少。当然,更高的精度(增量)也会增加处理时间。对于您的用例,由于您已经知道文本成90°角,因此可以尝试两个90°的增量,这应该很快。
然后,您需要使用另一种技术来检测它是否颠倒了。