Python,OpenCV中的光学字符识别(OCR Optical Character Recognition)

Posted 程序媛一枚~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python,OpenCV中的光学字符识别(OCR Optical Character Recognition)相关的知识,希望对你有一定的参考价值。

这篇博客将介绍什么是光学字符识别OCR,介绍OCR发展的简短历史,了解OCR真实的应用场景,了解OCR与方向和脚本检测(OSD)之间的区别。并了解图像预处理和后处理对于提高OCR结果的重要性。

  • OSD是任何OCR系统的基本组件。
  • 图像预处理和OCR结果后处理步骤,通常用于提高OCR精度。

1. 什么是OCR?

光学字符识别(Optical Character Recognition)简称OCR,是用于描述将文本图像转换为机器编码文本的算法和技术。主要包括以下3步:

  1. 接受输入图像(扫描、拍照或计算机生成);
  2. 就像人类“阅读”一样自动检测文本;
  3. 将文本转换为机器可读格式,以便在更大的计算机视觉系统范围内对其进行搜索、索引和处理;

OCR表面上看起来很简单,尽管计算机视觉领域已经存在了50多年,但研究人员尚未创建高度准确的通用OCR系统,依然道阻且长。

另外鉴于人类通过书写进行交流的方式有很多细微差别——有自然语言处理(NLP Natural Language Processing)的所有问题,并且计算机视觉系统在从图像读取文本时永远无法获得100%的准确度。噪声、书写风格、图像质量等方面的变量太多。OCR实现并不容易。

2. 光学字符识别简史

  • 1914年,早期的OCR技术完全是机械式的,伊曼纽尔·戈德伯格开发了可以读取字符并将其转换为标准电报代码的机器;

  • 1920~1930年,伊曼纽尔·戈德伯格开发了搜索缩微胶片(缩小的文档,通常是电影、报纸、期刊等)中的字符OCR。

  • 1974年,OCR主要致力于创建“盲人阅读机器”。

  • 1980年,惠普(HP)实验室开始研究Tesseract,2005年开源后很快成为世界上最流行的OCR引擎。

  • 2010年,Tesseart继续发展,称为长短时记忆(LSTM long short-term memory)网络的专门体系结构极大地提高了OCR的准确性

    LSTM引擎提供了显著的精度增益,使得即使在较差的非最佳条件下也能准确地识别OCR文本。
    LSTM引擎接受了超过123种语言的培训,使得除英语以外的语言(包括基于脚本的语言,如汉语、阿拉伯语等)进行OCR文本更加容易。

  • 2020年,OCR被谷歌、微软和亚马逊等科技巨头日益商业化。

3. 光学字符识别的应用

OCR有许多应用,最初的应用是为盲人创建阅读机器。自那时以来,OCR应用有了显著的发展,包括但不限于:

  • 自动车牌识别(ALPR/ANPR Automatic license/number plate recognition)
  • 交通标志识别(Traffic sign recognition)
  • 分析并击败网站上的CAPTCHA(区分计算机和人类的完全自动化公共图灵测试Analyzing and defeating CAPTCHAs (Completely Automated Public Turing tests to tell Computers and Humans Apart) on websites)
  • 从名片中提取信息(Extracting information from business cards)
  • 自动读取护照的机器可读区(MRZ machine-readable zone)和其他相关部分(Automatically reading the machine-readable zone and other relevant parts of a passport)
  • 解析银行支票中的路由号码、帐号和货币金额(Parsing the routing number, account number, and currency amount from a bank check)
  • 理解自然场景中的文本,如从智能手机拍摄的照片(Understanding text in natural scenes such as the photos captured from smartphone )

4. OSD 方向和脚本检测

OSD:Orientation and Script Detection方向和脚本检测

  • OCR是获取输入图像并以人类可读和机器可读格式返回文本的过程;
  • OSD是分析图像中文本元数据,特别是方向和脚本/书写风格的过程。
    可以说OSD信息是提高OCR准确性的前置步骤。

文本的方向是输入图像中文本的角度(以度为单位)。为了获得更高的OCR精度,需要应用OSD来确定文本方向,纠正它然后应用OCR。

脚本和书写风格是指用于书面和打字交流的一组字符和符号。OCR系统对特定脚本或书写系统所能做出的任何规则、启发或假设都将使OCR引擎在应用于给定脚本时更加准确。

5. 前处理和后处理的重要性

创建一个成功的OCR应用程序部分是科学,部分是艺术。

尽管 Tesseract OCR引擎的进步,OCR系统可以进行自动分割和页面分析。然而这些系统还是远不如人类智能,人类几乎可以即时解析复杂背景中的文本。

  • 如果在OCR前应用一些基本的图像处理操作,如阈值、距离变换和形态学操作,最终将得到清晰的图像。OCR将获得更好的效果;

  • 如果先对文本进行适当的清理和分割,OCR系统将更容易识别文本。

  • 后处理OCR文本。OCR系统永远不会100%准确,所以应该假设会有一些错误。为了帮助解决这个问题,可以应用一些规则和启发法。

6. OCR工具和API

接下来将介绍4部分内容:

  1. 探索世界上最流行的OCR软件包——Tesseract OCR引擎;

Tesseract OCR引擎是一个OCR软件包,最初开发于20世纪80年代,经历了多次修订和更新,现在是世界上最流行的OCR系统。
几乎每种流行编程语言(Java、C/C++、php等)都有Tesseract绑定。

  1. 了解Python和 PyTesseract 模块如何使用Tesseract进行推理

PyTesseract库是一个Python包,它是与tesseract命令行进行交互的二进制文件。只需使用一个或两个函数调用,就可以轻松地将Tesseract OCR应用于OCR项目。

  1. 了解计算机视觉和图像处理算法对OCR准确性的影响

为提升OCR的准确性,基于计算机视觉和图像处理,使用OpenCV或者Keras, TensorFlow, scikit-learn 对图像进行预处理或者后处理。

  • scikit学习库是使用Python训练机器学习模型时使用的标准包。
  • Keras和TensorFlow在一个易于使用的API中提供了所有深入学习的能力。
  1. 基于云的OCR API调用

当Tesseract从未训练过图像中的某种字体;或者经过预先训练的“现成”模型均不能够正确定位图像中的文本;或者开发自定义OCR可能需要花费太多的精力,可以考虑使用基于云的OCR API,例如微软Azure认知服务、Amazon RekGoNeNoint和谷歌云平台(Google Cloud Platform GCP)API。


缺点是付费使用;需要网络连接才可以提交图像并获取识别结果;有延迟不能用于实时应用;并不拥有整个OCR管道,只能用提供的一部分。

参考

以上是关于Python,OpenCV中的光学字符识别(OCR Optical Character Recognition)的主要内容,如果未能解决你的问题,请参考以下文章

[译]OpenCV的基础光学字符识别(Basic OCR in OpenCV)

Python+OpenCV+Tesseract实现OCR字符识别

通过字段识别和光学字符识别(OCR)进行数据输入自动化,用于预定义表格上的手写

如何识别作为光学字符识别 (OCR) 输出的文本中的实体?

使用Python,OpenCV进行卡类型及16位卡号数字的OCR

非黑即白--谷歌OCR光学字符识别