0%

ocr 识别

 OCR (Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗、亮的模式确定其形状,然后用字符识别方法将形状翻译成计算机文字的过程;即,针对印刷体字符,采用光学的方式将纸质文档中的文字转换成为黑白点阵的图像文件,并通过识别软件将图像中的文字转换成文本格式,供文字处理软件进一步编辑加工的技术。

本文初步介绍了 OCR 识别 的基本过程。

一、问题分析

图像中的文字识别可以看为图像分类的问题。即根据形状来判断是属于哪个字母。对于分类问题,一般需要训练数据和测试数据,分类器我采用支持向量机(SVM)

二、具体过程

a) 训练样本的输入

orc-trainData

首先对图进行灰度化,之后进行二值化(即变为0和1两个值)。对其进行分割为6*13的小图像,对每个图像找出最小的边缘(最左最右,最上最下)。

由于字母有大有小,进行归一化为同样的大小,32*32,最终的结果如下图

orc-trainData-result

b)测试样本的读入

orc-testData

同样的对图像进行进行二值化,找出所有的字符,然后根据间距判断是否为同一个单词,是否为同一行,进行分组。即(分为行,单词,字符)

对每一组内的每个单词的每个字符进行大小归一化,并按行输出结果。

如下图:

orc-testData-result
orc-trainData-result2

有一些难以区分的字母,所以划分错误。如I和l ,O和C但大部分还是准确的。

c) 纠错

因为有字母是相近的,所以容易区分错误。

单词纠错可以通过编辑距离来实现。

编辑距离,又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。

例如将kitten一字转成sitting:

  1. sitten  (k→s)
  2. sittin  (e→i)
  3. sitting (→g)

对于一个单词,判断其是否存在于字典中。(字典选取Tesseract-OCR词频表)

  • 若存在

    • 判断正确,可以直接输出。
  • 若不存在

    • 对其进行编辑操作,1次,看是否在字典中,存在则输出
    • 对其的编辑操作在做一次编辑操作,看是否在字典中,存在则输出
    • 若以上两个步骤中存在多个单词,则选取频率最高的进行输出

纠错样例:

orc-correctWord

d) 其他测试数据及结果

ocr-other-testfile
ocr-other-testfile-result

三、小结

本次实验在上一次的结果中进行了纠错,进一步提高了准确率。

但仍然存在一些不足,如字符纠错的时候,可以考虑数字0和字母o的相似性,直接进行转化。

在做的过程中,发现了这个领域上的难度。比如字体的不同可能需要新的训练样本、字母如果过小难以拆分等等。

总体来说,任务基本完成。也从中学到了许多知识。

本文所有代码:https://github.com/hrwhisper/myOcr

请我喝杯咖啡吧~