PHP OCR实战:用Tesseract从图像中读取文字

本文由码农网 –
邱康原创翻译,转载请看清文末的转载要求,欢迎参与我们的付费投稿计划!

本教程翻译自PyImageSearch英文原文

一、为啥需要搭建环境

  为了解决环境不统一问题,所以要搭建这么个玩意儿

Optical Character Recognition (OCR)即光学字符辨识是把打印文本转换成一个数字表示的过程。它有各种各样的实际应用–从数字化印刷书籍、创建收据的电子记录,到车牌识别甚至破解基于图像的验证码。

图片 1Tesseract
OCR

二、步骤

  Laravel对环境有所要求(不使用Homestead情况下),具体参考官网

  
使用Homestead步骤

图片 2

上周的博客内容,我们学习了如何安装Tesseract去做OCR识别。

  1. Homestead、VirtualBox、Vagrant

    摘要:

    Laravel
致力于让整个 PHP 开发体验变得愉快, 包括你的本地开发环境。 Vagrant
提供了一种简单,优雅的方式来管理和配置虚拟机。 Laravel Homestead
是一个官方预封装的 Vagrant
box,它为你提供了一个完美的开发环境,而无需在本地机器安装 PHP 、Web
服务器和其他服务器软件。不用担心会搞乱你的操作系统!Vagrant boxes
是一次性的。如果出现问题,你可以在几分钟内销毁并创建 Box! Homestead
可以运行在任何 Windows,Mac,或 Linux 系统,它包括了 Nginx web 服务器,
PHP 7.2,PHP 7.1,PHP 7.0,PHP 5.6,
MySQL,PostgreSQL,Redis,Memcached, Node,以及开发 Laravel
应用程序所需要的东西。——摘自后盾人向军大叔(网站升级中,后期补链接)

Tesseract是一个能实现OCR的开源项目。你能在*Nix系统,Mac系统和Windows系统上运行这个项目,但是只要使用一个库,我们就能在PHP项目中使用它了。本教程的目的是教你如何使用。

然后我们通过一些小图片示例去应用Tesseract测试和评估这个OCR引擎的性能。

   1. 1VirtualBox

    VirtualBox 是
Oracle 公司的开源虚拟机软件。VirtualBox
号称是最强的免费虚拟机软件,它不仅功能齐全,而且性能也很优异!VirtualBox
支持大部分流行的系统,如:Mac, Windows, Linux 等。

安装

我们的结论显示,Tesseract在前景文本和背景色区分的非常清晰的图片上工作非常好。实际上,保证这些类型的分割可能极具挑战性。因此,我们倾向于训练特定领域的图像分类器和检测器。

   1.2Vagrant

    Vagrant
是用来管理虚拟机的工具,支持当前主流的虚拟机系统如
VirtualBox、VMware、AWS 等。Vagrant
的主要作用是提供一个可配置、可移植和复用的软件环境。Vagrant
让你通过编写一个 Vagrantfile
文件来控制虚拟机的启动、虚拟机网络环境的配置、虚拟机与主机间的文件共享,以及启动后自动执行一些配置脚本,如自动执行一个
Shell Script
来安装一些必备的开发工具,如安装配置MySQL、PHP,甚至是自动配置 Nginx
站点。这意味着,在一个多人开发的项目中,你只需要同步 Vagrantfile
文件,就可以保证参与项目的每个人各自的机器上拥有一致的开发环境。
可以在下面网站上搜索需要的vagrant
box

准备

为了让事情变得简单和一致的, 我们将使用虚拟机(本文使用Vagrant)来运行应用程序,这会涉及到安装PHP和Nginx,我们将安装Tesseract来分别演示过程。如果你想自己基于现有Debian-based系统安装Tesseract,你可以跳过下一部分—或者查看the README来获得在其他*nix上,Mac系统或者Windows的安装指导.

然而,在我们需要将OCR应用于我们自己的项目的情况下,我们了解如何通过Python编程语言访问Tesseract
OCR非常重要(前提是我们可以获得Tesseract所需的漂亮,干净的分段)。

   1.3Homestead box

    Homestead是一个官方预封装的
Vagrant box,它为你提供了一个完美的开发环境,而无需在本地机器安装 PHP
、Web 服务器和其他服务器软件。不用担心会搞乱你的操作系统!Vagrant boxes
是一次性的。如果出现问题,你可以在几分钟内销毁并创建
Box!内置软件:Ubuntu 16.04、Git、PHP 7.2、PHP 7.1、Nginx、Apache 、MySQL
……

配置Vagrant

为了配置Vagrant以跟上本教程,完成如下步骤。或者你也可以简单的从Github获得代码。

 

输入以下命令来下载Homestead Improved Vagrant配置到一个名为orc的文件夹:

git clone https://github.com/Swader/homestead_improved ocr

将Nginx配置文件Homestead.yml中的以下代码:

sites:
    - map: homestead.app
      to: /home/vagrant/Code/Project/public

修改成:

sites:
    - map: homestead.app
      to: /home/vagrant/Code/public

同样要在hosts文件中添加

192.168.10.10       homestead.app

涉及OCR的示例项目可能包括[构建移动文档扫描程序](

   1.4 联系

    白话理解:

    1.vagrant把带有各种各样内置软件的Laravel/Homestead
box(还有其他的Homestead
box)打包成一个文件夹成为了一个镜像box来进行管理

    2.再把这个镜像box安装到VirtualBox这个虚拟主机当中,但因为它有可能有很多(vagrant
box
list来查看),所以需要对其中的具体的某一个进行标识,所以这就需要进行安装Homestead管理脚本,下载好之后呢,进入Homestead文件夹中,里面的Vagrantfile配置项就是决定着你使用的那个homestead
box,但是开发作者呢,将是将这个文件引用另外一个文件来进行管理的,所以我们需要进行一步操作

安装Tesseract

下一步是安装Tesseract

因为Homestead Improved 使用debian,我们可以在使用vagrant ssh登陆虚拟机后使用apt-get 来安装它,简单运行如下命令:

sudo apt-get install tesseract-ocr

正如上文提到的,在the README中有其他的操作系统对应教程。

在本章的其余部分,我们将学习如何安装Tesseract OCR +
Python“绑定”,然后编写一个简单的Python脚本来调用这些绑定。在本教程结束时,您将能够将图像中的文本转换为Python字符串数据类型。

   1.5 安装

    Ⅰ在线安装
Homestead Vagrant
Box,这样安装下载会非常慢(我最快网速15M/S反正是中断啊),可以使用第二种本地文件安装方式

vagrant box add laravel/homestead

    Ⅱ本地文件安装
先下载离线 homestead.box,然后执行

vagrant box add laravel/homestead d:/code/homestead.box

解释:

依次执行箭头所指:

          图片 3

          如果这个盒子不想用,可以进行删除(vagrant box remove
laravel/homestead) 其他的homestead box 只需要改名字就好啦~

   
III安装Homestead管理脚本

 1 # clone管理脚本 2 # 注意 切换到稳定版本,不是master哟(目前是7.18.0) 3 git clone https://github.com/laravel/homestead.git ~/Homestead 4  5 # 进入家目录 6 cd Homestead/ 7  8 # 因为master不稳定所以切到稳定tag  9 git checkout v7.18.0 10 11 # 创建 Homestead.yaml 配置文件(也就是Vagrantfile引用的文件),所以修改这个文件即可12 ./init.bat13 14 # 如果是本地安装的 homestead.box 则它的版本为0,所以需要修改下面步骤生成的配置文件 ~Homestead/scripts/homestead.rb 以下内容,不然的话启动homestead的时候会进行更新操作15 config.vm.box_version = settings["version"] ||= ">= 0"

    Ⅳ
SSH秘钥登陆(把镜像box安装到VirtualBox后,难免要登陆到操作系统当中,所以需要这一步)

第一步:修改 Homestead.yaml 文件

keys:    - ~/.ssh/id_rsa    - ~/.ssh/id_rsa.pub

    注意:进入cd .ssh/后这个文件夹中没有id_rsa
id_rsa.pub这两个文件要进行下一步操作

    执行 ssh-keygen -t rsa -C
“XXX@qq.com”,然后一路回车即可(中间有步骤让设置密码,因为是本地开发没必要设置,所以一路回车)

   V
文件夹同步配置(我们不可能每次需要进入虚拟机来进行代码的书写,所以需要将本机和虚拟机进行连接来进行代码书写)

1 # map: 本机文件夹路径2 # to: 推送到的虚拟主机路径3 # 这个过程是双向的4 # ~代表家目录(我的电脑是c:/Users/Dumpling)5 folders:6     - map: ~/code7       to: /home/vagrant/code

   VI vagrant命令(此时需要进入Homestead/文件夹)并测试文件同步

    启动虚拟机 —— vagrant up(因为在Homestead.yaml文件中的provider:
virtualbox所以会安装虚拟机会安装到这个里面)

 1 #启动 如果加上 --provision 选项那么添加的新站点会发布到虚拟机上。 2 cd ~/Homestead && vagrant up 3  4 #关闭 5 vagrant halt 6  7 #通过 SSH 登录 vagrant(需要先启动 vagrant) 8 vagrant ssh 9 10 #查看目前安装的box列表11 vagrant box list12 13 #删除box镜像14 vagrant box remove laravel/homestead15 16 #查看当前 Homestead 虚拟机的状态。17 vagrant status

    进入虚拟机 —— vagrant ssh

      图片 4

      测试文件同步

        此时虚拟机的code目录是空的,那么进入到家目录的code中创建一个文件看虚拟机中是否同时生成一个文件

          图片 5

          本机创建后,查看虚拟机情况如下

          图片 6

          同步成功

   VII 使用域名访问到homestead虚拟主机

    控制域名的地方在 Homestead.yaml文件中

1 # map:域名2 # to:域名指向的目录是虚拟机中的这个位置3 sites:4     - map: homestead.test5       to: /home/vagrant/code/public

      记得修改本机hosts文件哟(请按照自己的本本自行百度)

  Ⅷ homestead链接数据库

    就只有端口不一样而已~

      要从主机的数据库客户端连接到 MySQL,就连接到 127.0.0.1和端口
33060 。账号密码分别是 homestead/secret。

      PHP代码连接端口为 3306

        图片 7

  Ⅸ 全局命令

    Mac/Linux:

      如果iTems没有使用风格包zshrc的话,就在家目录下创建bash_profile文件,如有有的话修改修改zshrc文件

# 其实就是创建一个函数把进入Homestead/文件夹的操作,以及vagrant命令进行了结合# 函数名可以修改为自己的,我这里是为了方便记忆和区分function homestead(){    ( cd ~/Homestead && vagrant $* )}

    Windows:同上(我反正按照中文手册的操作是不行的~)

图片 8

    至此呢,有关于homestead的配置就完成啦~
如果有任何不足,请予以指出。

    最后呢 感谢一下后盾网~ 贼拉好的PHP学习,大家可以去看看哟

    谢谢观赏~

测试并定制安装

我们将使用PHP包装,但是之前我们可以在命令行测试Tesseract。

首先保存这个图片sign.png

在虚拟机中,执行如下命令来从图片中读取文字

tesseract sign.png out

这将在当前文件夹创建一个文件:out.txt里面应该有单词:CAUTION

现在尝试sign2.jpg

tesseract sign2.jpg out

这次产生单词Einbahnstral’ie。很接近但不正确—虽然图像中的文字相当清晰,它没能识别字符ß。

为了获使Tesseract正常读取字符串,我们需要安装一些新的语言文件—就本例来说,德语。

这里有一个全面的可用语言文件列表,但我们直接下载所需的文件:

wget https://tesseract-ocr.googlecode.com/files/tesseract-ocr-3.02.deu.tar.gz

解压:

tar zxvf tesseract-ocr-3.02.deu.tar.gz

然后把文件复制到如下目录:

/usr/share/tesseract-ocr/tessdata

例如

cp deu-frak.traineddata /usr/share/tesseract-ocr/tessdata
cp deu.traineddata /usr/share/tesseract-ocr/tessdata

现在我们再次执行原来的命令但是要用 –l

tesseract sign2.jpg out -l deu

“deu” 是德语的 ISO 639-3码.

这次,文字应该是Einbahnstraße(正确的)。

可以通过重复上述过程来使用任意语言。

本博客分为三部分。

配置应用程序

我们将使用这个库来用PHP使用Tesseract。

我们将建立一个极简的web应用:用户上传图片,并查看OCR处理结果。我们将使用Silex microframework 来实现。不要担心你不熟悉它,这个应用本身很简单。

记住这篇教程的所有代码都能在Github上获得。

第一步是用Composer来安装依赖文件:

composer require silex/silex twig/twig thiagoalessio/tesseract_ocr:dev-master

然后建立三个文件夹:

- public
- uploads
- views

我们需要上传表单(viewsindex.twig):

<html>
  <head>
    <title>OCR</title>
  </head>
  <body>

    <form action="" method="post" enctype="multipart/form-data">
      <input type="file" name="upload">
      <input type="submit">
    </form>

  </body>
</html>

需要一个结果展示页面(viewsresults.twig)::

<html>
  <head>
    <title>OCR</title>
  </head>
  <body>

    <h2>Results</h2>

    <textarea cols="50" rows="10">{{ text }}</textarea>

    <hr>

    <a href="/">← Go back</a>

  </body>
</html>

现在建立skeleton Silex app (publicindex.php):

<?php 

require __DIR__.'/../vendor/autoload.php'; 

use SymfonyComponentHttpFoundationRequest; 

$app = new SilexApplication(); 

$app->register(new SilexProviderTwigServiceProvider(), [
  'twig.path' => __DIR__.'/../views',
]);

$app['debug'] = true; 

$app->get('/', function() use ($app) { 

  return $app['twig']->render('index.twig');

}); 

$app->post('/', function(Request $request) use ($app) { 

    // TODO

}); 

$app->run();

如果你在浏览器访问这个应用,你应该能看到一个文件上传表单。如果你在使用Homestead Improved Vagrant,你可以通过如下链接访问该应用。

http://homestead.app/

下一步是实现文件上传。Silex使得这项工作非常简单;$request包含一个files组件,我们可以通过它来获得任意上传的文件,代码:

// Grab the uploaded file
$file = $request->files->get('upload'); 

// Extract some information about the uploaded file
$info = new SplFileInfo($file->getClientOriginalName());

// Create a quasi-random filename
$filename = sprintf('%d.%s', time(), $info->getExtension());

// Copy the file
$file->move(__DIR__.'/../uploads', $filename);

如你所见,我们产生随机文件名来减少文件名冲突—但在本应用中,我们怎么命名文件是不重要的。一旦我们在本地有一份文件拷贝,我们就可以产生一个Tessearct库的实例,然后进行分析:

// Instantiate the Tessearct library
$tesseract = new TesseractOCR(__DIR__ . '/../uploads/' . $filename);

在图像上实现OCR相当简单,我们只需调用方法recognize()。

// Perform OCR on the uploaded image
$text = $tesseract->recognize();

最后我们把结果展示到结果页面:

return $app['twig']->render(
    'results.twig',
    [
        'text'  =>  $text,
    ]
);

在一些图片上尝试,看看它效果怎样。如果你有困难,可以参考这个

首先,我们将学会如何安装pytesseract package
以便我们可以通过Python编程语言应用Tesseract。

一个实际的例子

让我们来看OCR一个更实用的例子。在本例中,我们尝试在图像中找到一个格式化的电话号码。

看看下面一幅图,上传到你的应用:

图片 9

结果应该如下:

:ii‘i
Customer Service Helplines

British Airways Helpline

09040 490 541

它没有挑出正文文本,这是我们能料到的,因为图片质量太差。虽然识别了号码但是也有一些“噪声”。

为了提取相关信息,有如下几件事我们可以做。

你可以让Tesseract 把它的结果限制在一定的字符集内,所以我们告诉它只返回数字型的内容代码如下:

$tesseract->setWhitelist(range(0,9));

但这样有个问题。它常常把非数字字符解释成数字而非忽略它们。比如“Bob”可能被解释称数字“808”。

所以我们采用两步处理。

  1. 尝试提取可能是电话号码的数字串。
  2. 用一个库轮流评估每一个候选字符,一旦找到一个有效电话号码则停止。

第一步,我们可以用一个基本的正则表达式。可以用谷歌电话库来确定一个数字串是否是合法电话号码。

备注:我已在Sitepoint 写过关于谷歌电话库的内容。

让我们给谷歌电话库添加一个PHP 端口,修改composer.json,添加:

"giggsey/libphonenumber-for-php": "~7.0"

别忘了升级:

composer update

现在我们可以写一个函数,输入为一个字符串,尝试提取一个合法的电话号码

/**
 * Parse a string, trying to find a valid telephone number. As soon as it finds a 
 * valid number, it'll return it in E1624 format. If it can't find any, it'll 
 * simply return NULL.
 * 
 * @param  string   $text           The string to parse
 * @param  string   $country_code   The two digit country code to use as a "hint"
 * @return string | NULL
 */
function findPhoneNumber($text, $country_code = 'GB') {

  // Get an instance of Google's libphonenumber
  $phoneUtil = libphonenumberPhoneNumberUtil::getInstance();

  // Use a simple regular expression to try and find candidate phone numbers
  preg_match_all('/(+d+)?s*((d+))?([s-]?d+)+/', $text, $matches);

  // Iterate through the matches
  foreach ($matches as $match) {

    foreach ($match as $value) {

      try {

        // Attempt to parse the number
        $number = $phoneUtil->parse(trim($value), $country_code);    

        // Just because we parsed it successfully, doesn't make it vald - so check it
        if ($phoneUtil->isValidNumber($number)) {

          // We've found a telephone number. Format using E.164, and exit
          return $phoneUtil->format($number, libphonenumberPhoneNumberFormat::E164);

        }

      } catch (libphonenumberNumberParseException $e) {

        // Ignore silently; getting here simply means we found something that isn't a phone number

      }

    }
  }

  return null;

}

希望注释能解释这个函数在干什么。注意如果这个库没能从字符串中解析出一个合法的电话号码它会抛出一个异常。这不是什么问题;我们直接忽略它并继续下一个候选字符。

如果我们找到一个电话号码,我们以E.164的形式返回它。这提供了一个国际化的号码,我们可以用来打电话或者发送SMS。

现在我们可以如下使用:

$text = $tesseract->recognize();

$number = findPhoneNumber($text, 'GB');

我们需要给谷歌电话库提供一个提示来说明这个号码是哪个国家的。你也可以改成你自己的国家。

我们把所有的这些打包在一个新的路由中:

$app->post('/identify-telephone-number', function(Request $request) use ($app) { 

  // Grab the uploaded file
  $file = $request->files->get('upload'); 

  // Extract some information about the uploaded file
  $info = new SplFileInfo($file->getClientOriginalName());

  // Create a quasi-random filename
  $filename = sprintf('%d.%s', time(), $info->getExtension());

  // Copy the file
  $file->move(__DIR__.'/../uploads', $filename); 

  // Instantiate the Tessearct library
  $tesseract = new TesseractOCR(__DIR__ . '/../uploads/' . $filename);

  // Perform OCR on the uploaded image
  $text = $tesseract->recognize();

  $number = findPhoneNumber($text, 'GB');

  return $app->json(
    [
      'number'     =>  $number,
    ]
  );

});

我们现在有简单的API的基础—-也就是JSON响应-—我们可以用来作为一个简单的移动应用的后端,这款应用可以用来从一幅图中添加联系人,打电话。

然后,我们将开发一个简单的Python脚本来加载图片,二值化图片并且将图片传给Tesseract
OCR 系统。

总结

OCR有许多应用——并且很容易整合进你的应用(超过你的预期)。本文中,我们安装了开源OCR包;并使用一个包装器库,把它整合进一个非常简单的PHP应用。我们只是触及到了所有可能性的表面,希望这能给你一些想法,帮你想想怎么在你自己的应用中使用OCR。

最后,我们将在一些示例图像上测试我们的OCR管道并查看结果。

在Python中绑定Tesseract

让我们从安装pytesseract开始吧。我们将利用pip来安装pytesseract

如果你使用的是虚拟环境(我强烈推荐这样,以便您可以隔离不同的项目),使用workon命令为你的环境配置合适的名称。在这个例子中,我们的虚拟环境叫做cv

$ workon cv

接下来我们来安装 Pillow,一个跟友好的pytesseract依赖的PIL端口。

$ pip install pillow$ pip install pytesseract

*注意:pytesseract 并不是提供
一个真正的Python绑定。而是简单的提供tesseract库的接口。如果你看它在GitHub的项目你将发现该库将图像写入磁盘上的临时文件,然后在文件上调用tesseract二进制文件并捕获结果输出。这绝对有些取巧,但它为我们完成了工作。*

让我们继续,查看一些将前景文本从背景中分割出来的代码,然后使用我们新安装的pytesseract。

使用Tesseract和Python应用OCR

让我们首先创建一个名字叫ocr.py 的新文件:

1. # import the necessary packages2. from PIL import Image3. import pytesseract4. import argparse5. import cv26. import os7. 8. # construct the argument parse and parse the arguments9. ap = argparse.ArgumentParser()10. ap.add_argument("-i", "--image", required=True, help="path to input image to be OCR'd")11. ap.add_argument("-p", "--preprocess", type=str, default="thresh", help="type of preprocessing to be done")12. args = vars(ap.parse_args

2-6行是处理引用库。我们从硬盘加载图片需要使用Image类,当使用pytesseract时需要引入pytesseract库。

9-14行是处理输入的命令参数,我们有2个入参:

–image: 传入给OCR系统的图片路径。

–preprocess:处理的方法。这个是可选的开关,目前这个参数只接受2个值:thresh或者blur。下面我们将要加载图片,对图片进行二值化并且将结果写入硬盘。

16. # load the example image and convert it to grayscale17. image = cv2.imread(args["image"])18. gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)19. 20. # check to see if we should apply thresholding to preprocess the21. # image22. if args["preprocess"] == "thresh":23. gray = cv2.threshold(gray, 0, 255,24. cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]25. 26. # make a check to see if median blurring should be done to remove27. # noise28. elif args["preprocess"] == "blur":29. gray = cv2.medianBlur30. 31. # write the grayscale image to disk as a temporary file so we can32. # apply OCR to it33. ilename = "{}.png".format(os.getpid34. cv2.imwrite(filename, gray)

首先,我们将–image参数的图片从硬盘加载到内存中(第17行),接着对它进行灰度处理。(第18行

接下来,根据传入的预处理参数,我们选择threshold或者blur来处理图片。这里我们可能需要添加更多的预处理方法处理超出本章范围的情况。

第22-24行执行threshold方法分离图片的前景和背景。我们通过使用
cv2.THRESH_BINARY 和 cv2.THRESH_OTSU标志处理。更多细节,请看在
official OpenCV documentation中查看*“Otsu’s Binarization”。

稍后我们将在结果部分中看到,这种阈值处理方法可用于读取叠加在灰色形状上的暗文本。

或者,可以应用模糊方法。
当–preprocess标志设置为blur时,第28-29行执行中值模糊。应用中值模糊可以帮助减少盐和胡椒的噪音,再次使Tesseract更容易正确地OCR图像。

在预处理图片之后,我们使用os.getpid根据Python脚本的进程ID派生临时图片文件名称(33行)。

使用pytesseract进行OCR之前的最后一步是将预处理后的图像灰色写入磁盘,并使用上面的文件名保存它(第34行)。

我们最终可以使用Tesseract Python“绑定”将OCR应用于我们的图像:

36. # load the image as a PIL/Pillow image, apply OCR, and then delete37. # the temporary file38. text = pytesseract.image_to_string(Image.open)39. os.remove40. print41. 42. # show the output images43. cv2.imshow("Image", image)44. cv2.imshow("Output", gray)45. cv2.waitKey

第38行,我们使用pytesseract.image_to_string方法将图片内容转化为文本字符串。需要注意的是,我们传的是对图片的临时引用。

第39行,我们清除了临时文件。

我们在40行打印出识别的文本到控制台上。在你自己的应用中,你可能会想在这本上要做一些额外的处理。例如:拼写错误检查或者自然语言处理代替在控制台输出文本,这些内容我们将要在本章后面讲解。

最后,第43和44行分别展示原始图片和预处理后的图片。43行的cv2.waitKey
等待指令,等待从键盘输入任意字符后退出程序。

下面让我们开始动手写代码。

现在创建一个ocr.py的文件,是时候让我们使用Python + Tesseract
针对一些示例图片进行OCR识别了。

在这个章节中我们将使用如下步骤尝试OCR识别三个示例图片:

首先,我们将按照Tesseract库原样运行每个图片。然后,我们将运行ocr.py脚本通过Tesseract实现预处理文件来处理每个图片。最后,我们将比较这两种方法的结果并记录任何错误。

我们第一个例子是一个“噪点”图片。此图像包括我们期望的前景色是黑色的文本,背景色是部分白色和部分人工生成的灰色的圆点。灰色的污点充当我们算法的“干扰者”。

图片 10Noisy
Image

我们可以使用Tesseract识别原始的、未处理的图片。就像我们上一章的内容。

1. $ tesseract images/example_01.png stdout2. Noisy image3. to test4. Tesseract OCR

Tesseract表现的非常好,在这个例子中没有任何错误。

现在让我们确认下我们新的脚本,ocr.py ,同样运行良好:

1. $ python ocr.py --image images/example_01.png2. Noisy image3. to test4. Tesseract OCR

图片 11应用ocr.py

正如您在此屏幕截图中看到的那样,阈值图像非常清晰,背景已被删除。我们的脚本正确地将图像的内容打印到控制台。

接下来,让我们在背景中的“盐和胡椒”噪声图像上测试Tesseract和我们的预处理脚本:

图片 12“盐和胡椒”噪声图像

我们可以在下面看到tesseract的输出结果:

1. $ tesseract images/example_02.png stdout2. Detected 32 diacritics3. " Tesséra‘c't Will4. Fail With Noisy5. Backgrounds

不幸的是,Tesseract没有成功地对图像中的文本进行OCR识别。

但是,通过在ocr.py中使用模糊预处理方法,我们可以获得更好的结果:

1. $ python ocr.py --image images/example_02.png --preprocess blur2. Tesseract Will3. Fail With Noisy4. Backgrounds

图片 13模糊预处理方法识别图片

成功了!通过模糊预处理步骤使Tesseract正确的识别和输出我们期望的文本。

最后,让我们尝试另外一个图片,这个图片有更多的文本:

图片 14更多文本的图片

以上图片是我的书Practical Python and OpenCV 中的*“Prerequisites”
*章节截图。让我们来看看Tesseract如何处理这个图片:

1. $ tesseract images/example_03.png stdout2. PREREQUISITES3. 4. In order In make the rnosi of this, you will need (a have5. a little bit of pregrarrmung experience. All examples in this6. book are in the Python programming language. Familiarity7. with Pyihon or other scriphng languages is suggesied, but8. mm required.9. 10. You'll also need (a know some basic mathematics. This11. book is handson and example driven: leis of examples and12. lots of code, so even if your math skills are noi up to par.13. do noi worry! The examples are very damned and heavily14. documented (a help yuu follaw along.

然后使用ocr.py测试图像:

1. $ python ocr.py --image images/example_03.png2. PREREQUISITES3. 4. Lu order to make the most ol this, you will need to have5. a little bit ol programming experience. All examples in this6. book are in the Python programming language. Familiarity7. with Python or other scripting languages is suggested, but8. not requixed.9. 10. You’ll also need to know some basic mathematics. This11. book is handson and example driven: lots of examples and12. lots ol code, so even ii your math skills are not up to par,13. do not worry! The examples are very detailed and heavily14. documented to help you tollow along.

图片 15识别结果

注意两个输出中的拼写错误,包括但不限于“In”“of”“required”“programming”“follow”

两者的输出都不匹配;然而,有趣的是,预处理版本只有8个字错误,而非预处理图像有17个字错误。
我们的预处理可以帮助非干净的背景条件下识别文字!

Python +
Tesseract在这里做了一个合理的工作,但我们再一次证明了库作为现成的分类器的局限性。

我们可以使用Tesseract for
OCR获得良好或可接受的结果,但最佳准确度将来自在实际真实世界图像中出现的特定字体集上的自定义字符分类器上的训练。

不要让Tesseract OCR的结果让您失望 –
只需管理您的期望并对Tesseract的表现保持现实。没有真正的“现成”OCR系统可以为您提供完美的结果。

*注意:如果您的文字被轮换,您可能希望进行额外的预处理,如之前关于纠正文本偏斜的博客文章中所执行的那样。否则,如果您对构建[移动文档扫描程序](
)感兴趣,你现在有一个相当不错的OCR系统可以集成到它中。*

在今天的博客文章中,我们学习了如何将Tesseract
OCR引擎应用于Python编程语言。这使我们能够在我们的Python脚本中应用来自within的OCR算法。

最大的缺点是Tesseract本身的局限性。当前景文本中有
干净分割时,Tesseract效果最佳。

此外,这些分割需要尽可能高的分辨率输入图像中的字符在分割后不会出现“像素化”。如果字符确实出现像素化,那么Tesseract将难以正确识别文本

  • 即使应用在理想条件下捕获的图像,我们也发现了这一点。

OCR虽然不再是一项新技术,但仍然是计算机视觉文献研究的一个活跃领域*尤其是在将OCR应用于真实世界的无约束图像时。深度学习和卷积神经网络无疑使我们能够获得更高的准确度,但我们距离看到“接近完美”的OCR系统还有很长的路要走。此外,由于OCR在许多域中具有许多应用程序,因此用于OCR的一些最佳算法是商业性的,并且需要许可才能在您自己的项目中使用。

在将OCR应用于自己的项目时,我向读者提出的主要建议是首先尝试使用Tesseract,如果结果不合适,请转到Google
Vision API。

如果* Tesseract Google Vision API

*都没有获得合理的准确度,您可能需要重新评估数据集并确定是否值得培训自己的自定义字符分类器

这尤其是如果为真您的数据集有噪音和/或包含您希望检测和识别的特定字体。特定字体的示例包括信用卡上的数字,在支票底部找到的帐户和路由号码,或图形设计中使用的程式化文本。

我希望你能在Python和OpenCV上享受关于光学字符识别的一系列博客文章!

发表评论

电子邮件地址不会被公开。 必填项已用*标注