OCR识别的开源分析

OCR软件主要是由下面几个部分组成。

  1. 图像输入、预处理:
  2. 图像输入:对于不同的图像格式,有着不同的存储格式,不同的压缩方式。预处理:主要包括二值化,噪声去除,倾斜较正等
  3. 二值化:
  对摄像头拍摄的图片,大多数是彩色图像,彩色图像所含信息量巨大,对于图片的内容,我们可以简单的分为前景与背景,为了让计算机更快的,更好的识别文字,我们需要先对彩色图进行处理,使图片只前景信息与背景信息,可以简单的定义前景信息为黑色,背景信息为白色,这就是二值化图了。
  4. 噪声去除:
  对于不同的文档,我们对燥声的定义可以不同,根据燥声的特征进行去燥,就叫做噪声去除
  5. 倾斜较正:
  由于一般用户,在拍照文档时,都比较随意,因此拍照出来的图片不可避免的产生倾斜,这就需要文字识别软件进行较正。
  6. 版面分析:
  将文档图片分段落,分行的过程就叫做版面分析,由于实际文档的多样性,复杂性,因此,目前还没有一个固定的,最优的切割模型。
  7. 字符切割:
  由于拍照条件的限制,经常造成字符粘连,断笔,因此极大限制了识别系统的性能,这就需要文字识别软件有字符切割功能。
  8. 字符识别:
  这一研究,已经是很早的事情了,比较早有模板匹配,后来以特征提取为主,由于文字的位移,笔画的粗细,断笔,粘连,旋转等因素的影响,极大影响特征的提取的难度。
  9. 版面恢复:
  人们希望识别后的文字,仍然像原文档图片那样排列着,段落不变,位置不变,顺序不变,的输出到word文档,pdf文档等,这一过程就叫做版面恢复。
  10. 后处理、校对:
  根据特定的语言上下文的关系,对识别结果进行较正,就是后处理。

开源引擎

Cuneiform for Linux —— 本来是个Windows软件,这是Linux的移植,2011年4月已经停止维护。
GNU Ocrad —— 命令行工具。有JS移植,可用于前端。
GOCR —— 命令行工具。有JS移植,可用于前端。
Tesseract —— 开源OCR引擎,也有命令行工具。HP开发Google接手。3.0之后支持训练。Golang绑定。入门教程。
OCRopy —— 基于训练的OCR引擎,训练后可以达到比Tesseract更高的准确度,项目比Tesseract更年轻。包含一个叫做OCRopus的布局分析器。in Python。
Microsoft OCR Library —— Windows8.1之后的版本内置OCR引擎,可用于桌面和WindowsPhone。
Abbyy —— 收费软件,有SDK,有Cloud版本。

预处理代码
OpenCV —— 图像处理老大哥。OpenCV3中有Scene Text Detection值得一用。
Libccv —— 现代图像处理库,被很多人推荐。实现了精选的若干个图像处理算法,干净容易移植。其中Stroke Width Transfor尤其有用。
lswms —— 分行检测。
OCRopus —— 基于神经学习网络算法的布局分析库。教程。
TiRG —— 文字区域检测库,效果演示。
unpaper —— 检测文字和旋转,用的是Hough transform算法。

Scene Text Detection(opencv)
API,
例子1,
例子2,
Paper,
高层包装应用。

高层项目
node-dv —— in Node.js,整合了OpenCV、Tesseract和一些其他项目。
node-fv —— node-dv的更高层,用于证件识别。
OpenOCR —— 包装了SWT、Tesseract、Docker、RabbitMQ,提供队列和HTTP访问服务。in Golang。
openalpr —— 包装了Tesseract和OpenCV,支持多系统build,支持Docker,有Python和Node.js绑定。

android移动端
tess-two,Tesseract的安卓移植,教程。
microblink,免费的移动OCR-SDK。

新方法:机器学习
如果有够多的样本和验证能力,机器学习可以很好的处理OCR的问题。
http://www.danvk.org/2015/01/09/extracting-text-from-an-image-using-ocropus.html
http://www.danvk.org/2015/01/11/training-an-ocropus-ocr-model.html
https://en.wikipedia.org/wiki/Long_short_term_memory
https://github.com/nypl/map-vectorizer

一个快速深度学习的框架,和基于它构建的OCR项目。
https://github.com/BVLC/caffe/
https://github.com/pannous/caffe-ocr