原创内容,禁止转载!
导读:这是 Python OpenCV 图像处理 专栏的第6篇文章,主要介绍了使用 Python OpenCV 图像处理进行字符(大写字母和数字)识别的思想、方法。关于 Python OpenCV 处理的基础知识,可以参考这篇文章 [171102] Python3 OpenCV3 图像处理基础(Python3 + Numpy + Matplotlib + OpenCV3 + ...)。更多文章,请查看 [171101] Python OpenCV 图像处理专栏目录。
OCR(Optical character recognition) 光学字符识别,是对扫描文档、文本或场景文字照片等进行处理,其中的字符的操作。OCR广泛应用于银行卡号识别、身份证号识别、快递单号识别、扫描文档字符识别、验证码识别、文本电子化等场景。OCR是一个多学科交叉领域,涉及到计算机视觉(图像处理)、模式识别、机器学习和神经网络等方面知识。这里介绍一种简单的基于 Python OpenCV 图像处理和机器学习的大写字母和数字字符识别。希望从对OCR由感性认识加深到理性认识,为进一步使用深度学习等进行字符识别储备基础。
OCR(Optical character recognition) 光学字符识别,是对扫描文档、文本或场景文字照片等进行处理,其中的字符的操作。OCR广泛应用于车牌识别、银行卡号识别、身份证号识别、快递单号识别、扫描文档字符识别、验证码识别、文本电子化等场景。OCR是一个多学科交叉领域,涉及到计算机视觉(图像处理)、模式识别、机器学习和神经网络等方面知识。这里介绍一种简单的基于 Python OpenCV 图像处理和机器学习的大写字母和数字字符识别。希望从对OCR由感性认识加深到理性认识,为进一步使用深度学习等进行字符识别储备基础。
光学字符识别的主要技术
1. 预处理
(1) 倾斜矫正(deskew)
当扫描文本没有很好的对齐是,需要进行一定角度的旋转,使得处理后的字符水平或垂直对齐。
(2) 去除杂点(despeckle)
使用滤波或其他方法,平滑图像抑制噪声,尽量去除杂点。
(3) 二值化(binarisation)
二值化就是将多通道图或灰度图按照一定操作进行处理,得到黑白二值图像。二值化的结果对后续字符识别结果有着直接影响。
(4) 版面分析(layout analysis)
识别段落(paragraphs)、文字块(text blocks)等,使后续进行分块分区域进行处理。
(5) 检测行和单词(line and word detection)
对于单独文字块,检测文本行和单词,估计文本行的基线(baseline),必要时分割单词(seperate words)。
(6) 字符分离(isolation)
分割(split)与合并(merge):将多个字符分割成单独的字符,并在必要时合并被误拆分字符。
(7) 归一化字符(normalization)
将分离的字符归一化到固定尺寸(如8x12)。
2. 字符识别
法一:
模板匹配(template matching)
即计算分离字符块图像和标准字符块图像的相关系数,但是这个方法太古老了,在字符形状"几乎一致"的情况下有效。
法二:
字体特征提取和模式识别(feature extraction and pattern recognition)
使用好的特征(而不是原始数据)可以使计算更有效率,使用模式识别的方法使得识别更加准确。
(1) 提取特征
从字符块中提取出合适的能很好表征字符类别(也就是能很好表示字符到底是哪个)的特征,
如占空比、重心、水平垂直分布、笔画的方向、笔画交叉点、笔画闭环、HOGs、LBP等特征,
并将其表示成向量来代替字符图块。
(2) 训练模型
对已标注的字符块,提取特征后,使用K近邻(KNN)、支撑向量机(Support Vector Machine)、
多层感知器(MLP)、人工神经网络(ANN)、卷积神经网络(CNN)等方法训练得到字符模型。
(3) 识别
对待识别的字符块,提取特征后,送入模型解算得到识别结果。
3. 后处理
对于识别得到的字符,如果按照字符频率、单词上下文等进行校正。
这部分就比较高级了,需要更专业的领域知识来辅助。

完结,手动撒花~
参考:
1. ORC: https://en.wikipedia.org/wiki/Optical_character_recognition