OCR (Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗、亮的模式确定其形状,然后用字符识别方法将形状翻译成计算机文字的过程;即,针对印刷体字符,采用光学的方式将纸质文档中的文字转换成为黑白点阵的图像文件,并通过识别软件将图像中的文字转换成文本格式,供文字处理软件进一步编辑加工的技术。
本文初步介绍了 OCR 识别 的基本过程。
一、问题分析
图像中的文字识别可以看为图像分类的问题。即根据形状来判断是属于哪个字母。对于分类问题,一般需要训练数据和测试数据,分类器我采用支持向量机(SVM)
二、具体过程
a) 训练样本的输入

首先对图进行灰度化,之后进行二值化(即变为0和1两个值)。对其进行分割为6*13的小图像,对每个图像找出最小的边缘(最左最右,最上最下)。
由于字母有大有小,进行归一化为同样的大小,32*32,最终的结果如下图

b)测试样本的读入

同样的对图像进行进行二值化,找出所有的字符,然后根据间距判断是否为同一个单词,是否为同一行,进行分组。即(分为行,单词,字符)
对每一组内的每个单词的每个字符进行大小归一化,并按行输出结果。
如下图:


有一些难以区分的字母,所以划分错误。如I和l ,O和C但大部分还是准确的。
c) 纠错
因为有字母是相近的,所以容易区分错误。
单词纠错可以通过编辑距离来实现。
编辑距离,又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。
例如将kitten一字转成sitting:
- sitten (k→s)
- sittin (e→i)
- sitting (→g)
对于一个单词,判断其是否存在于字典中。(字典选取Tesseract-OCR词频表)
若存在
- 判断正确,可以直接输出。
若不存在
- 对其进行编辑操作,1次,看是否在字典中,存在则输出
- 对其的编辑操作在做一次编辑操作,看是否在字典中,存在则输出
- 若以上两个步骤中存在多个单词,则选取频率最高的进行输出
纠错样例:

d) 其他测试数据及结果


三、小结
本次实验在上一次的结果中进行了纠错,进一步提高了准确率。
但仍然存在一些不足,如字符纠错的时候,可以考虑数字0和字母o的相似性,直接进行转化。
在做的过程中,发现了这个领域上的难度。比如字体的不同可能需要新的训练样本、字母如果过小难以拆分等等。
总体来说,任务基本完成。也从中学到了许多知识。