识别图片中的文字 - Tesseract 和 百度云OCR的对比

当今时代人工智能都已经是烂大街的词了,OCR应该也很多人都知道。

OCR (Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗、亮的模式确定其形状,然后用字符识别方法将形状翻译成计算机文字的过程。

本文主要记录了通过Python使用OCR的两次尝试。

Tesseract

Tesseract,一款由HP实验室开发由Google维护的开源OCR(Optical Character Recognition , 光学字符识别)引擎,特点是开源,免费,支持多语言,多平台。

项目地址:https://github.com/tesseract-...

安装使用

Tesseract的安装比较简单,在mac可以通过brew安装。

brew install --with-training-tools tesseract

在windows可以通过exe安装包安装,下载地址可以从GitHub项目中的wiki找到。安装完成后记得将Tesseract 执行文件的目录加入到PATH中,方便后续调用。

另外,默认安装会包含英文语言训练包,如果需要支持简体中文或者繁体中文,需要在安装时勾选。

tesseract-lang

或者安装结束后到项目地址下载:https://github.com/tesseract-...

下载好的语言包放入到安装目录中的testdata下即可。在windows系统你还需要将testdata目录也加入环境变量。

TESSDATA_PREFIX=C:\Program Files (x86)\Tesseract-OCR\tessdata

如果一切就绪,你在命令行中就可以使用Tesseract命令。

# tesseract
Usage:
  tesseract --help | --help-psm | --help-oem | --version
  tesseract --list-langs [--tessdata-dir PATH]
  tesseract --print-parameters [options...] [configfile...]
  tesseract imagename|stdin outputbase|stdout [options...] [configfile...]

OCR options:
  --tessdata-dir PATH   Specify the location of tessdata path.
  --user-words PATH     Specify the location of user words file.
  --user-patterns PATH  Specify the location of user patterns file.
  -l LANG[+LANG]        Specify language(s) used for OCR.
  -c VAR=VALUE          Set value for config variables.
                        Multiple -c arguments are allowed.
  --psm NUM             Specify page segmentation mode.
  --oem NUM             Specify OCR Engine mode.
NOTE: These options must occur before any configfile.

通过命令行你就可以完成简单的图片文字识别任务。

tesseract test.png outfile -l chi_sim

通过Python调用

Tesseract安装完成后可以很方便的被Python调用,你需要安装两个包。

pip install pillow
pip install pytesseract

一个简单的图片转文字的函数实现如下。

from PIL import Image
import pytesseract

class Languages:
    CHS = 'chi_sim'
    CHT = 'chi_tra'
    ENG = 'eng'

def img_to_str(image_path, lang=Languages.ENG):
    return pytesseract.image_to_string(Image.open(image_path), lang)
  
print(img_to_str('image/test1.png', lang=Languages.CHS))
print(img_to_str('image/test2.png', lang=Languages.CHS))

测试图片- test1.png

test1

识别结果:

process image file "image/test1.png" in 1.4782530478747697 seconds

8 所 调 人 , 在 - 方 。
深 从 久 , 定 中 央
。 所 澈 伊 人 , 圭 水 淳
。 淇 渡 从 之 , 定 圭 北 中 坂 。
。 所 澈 伊人 , 圭 水 浩
从 丿 , 定 圭 水 中 沥 。

测试图片 - test2.png

test1

识别结果:

process image file "image/test2.png" in 1.2131140296607923 seconds

清 明 时 节 雨 纷 纷 , 路 上 行 人 欲 断 魂
信 问 酒 家 何 处 有 , 牧 奕 通 指 枪 花 村 。

小结

Tesseract在识别清晰的标准中文字体效果还行,稍微复杂的情况就很糟糕,而且花费的时间也很多,我个人觉得唯一的优点就是免费了。如果你不介意多花时间,可以考虑使用它提供的训练功能自定义你的语言库,那样在特定场景下识别率应该能上一个台阶。

百度云OCR

这是偶然的发现,百度云提供了一定额度的免费的OCR API,目前是每日500次,做做研究或者小应用还勉强够用,本文主要为了测试其效果。

文档地址:https://cloud.baidu.com/doc/O...

安装使用

首先你需要注册一个百度云BCE账号,然后从控制面板新建一个文字识别应用。baidu-ocr

之后你就可以获得调用API需要的 AppID,API Key 和 Secret Key。后面只要根据官方文档一步一步走就可以了。

pip install baidu-aip

封装和调用

参考文档: https://cloud.baidu.com/doc/O...

from aip import AipOcr

config = {
    'appId': 'your-id',
    'apiKey': 'your-key',
    'secretKey': 'your-secret-key'
}

client = AipOcr(**config)

def get_file_content(file):
    with open(file, 'rb') as fp:
        return fp.read()

def img_to_str(image_path):
    image = get_file_content(image_path)
    result = client.basicGeneral(image)
    if 'words_result' in result:
        return '\n'.join([w['words'] for w in result['words_result']])

测试图片- test1.png

test1

识别结果:

process image file "image/test1.png" in 0.6331169034812572 seconds

蒹葭
先秦:佚名
蒹葭苍苍,白露为霜。所谓伊人,在水一方。
溯洄从之,道阻且长。溯游从之,宛在水中央。
蒹葭萋萋,白露未晞。所谓伊人,在水之湄。
溯洄从之,道阳且跻。溯游从之,宛在水中坻。
蒹葭采采,白露未已。所谓伊人,在水之涘。
溯洄从之,道阻且右。溯游从之,宛在水中沚。

测试图片 - test2.png

test1

识别结果:

process image file "image/test2.png" in 0.6621812639450142 seconds

清明时节雨纷纷,路上行人欲断魂。
借问酒家何处有,牧童遥指杏花村。

小结

测试结果很明显,我只能说百度云这个OCR真是挺厉害的,一个错别字都没有,不服不行。论中文,还是百度比谷歌更懂一点。而且百度OCR提供了更多的参数让你更灵活的处理图片,比如自定义旋转,返回可信度,特定类型证件识别等等。

更多的OCR

除了本文提到的OCR,其实还是有不少其他选择。有一些直接提供Demo页面,你直接上传一张图片就可以直接看到识别效果,比如:

你有没有发现所有的大公司都有这样的服务?以后我们买买买就行,花大力气去发明轮子就没多大意义了。

关于作者:Python技术爱好者,目前从事测试开发相关工作,转载请注明原文出处。欢迎关注我的博客 https://tobyqin.cn,你可以到我的公众号中去当吃瓜群众。

Betacat.online


Python测试开发
边测试边开发,边当群众边吃瓜。

未上线的猫。

1.4k 声望
130 粉丝
0 条评论
推荐阅读
使用timeit测试Python函数的性能
timeit是Python标准库内置的小工具,可以快速测试小段代码的性能。认识timeittimeit 函数: {代码...} 参数说明:stmt: statement的缩写,你要测试的代码或者语句,纯文本,默认值是 "pass"setup: 在运行stmt前的...

betacat阅读 2k

Ubuntu20.04 从源代码编译安装 python3.10
Ubuntu 22.04 Release DateUbuntu 22.04 Jammy Jellyfish is scheduled for release on April 21, 2022If you’re ready to use Ubuntu 22.04 Jammy Jellyfish, you can either upgrade your current Ubuntu syste...

ponponon1阅读 4k评论 1

日常Python 代码片段整理
1、简单的 HTTP Web 服务器 {代码...} 2、单行循环List {代码...} 3、更新字典 {代码...} 4、拆分多行字符串 {代码...} 5、跟踪列表中元素的频率 {代码...} 6、不使用 Pandas 读取 CSV 文件 {代码...} 7、将列表...

墨城2阅读 296

Unicode 正则表达式(qbit)
前言本文根据《精通正则表达式》和 Unicode Regular Expressions 整理。本文的示例默认以 Python3 为实现语言,用到 Python3 的 re 模块或 regex 库。基本的 Unicode 属性分类 {代码...} 基本的 Unicode 子属性Le...

qbit阅读 4.3k

Python + Sqlalchemy 对数据库的批量插入或更新(Upsert)
由于不同数据库对这种 upsert 的实现机制不同,Sqlalchemy 也就不再试图做一致性的封装了,而是提供了各自的方言 API,具体到 Mysql,就是给 insert statement ,增加了 on_duplicate_key_update 方法。

songofhawk1阅读 1.9k评论 4

封面图
Go for 循环有时候真的很坑。。。
大家好,我是煎鱼。不知道有多少 Go 的面试题和泄露,都和 for 循环有关。今天我在周末认真一看,发现了 redefining for loop variable semantics 。著名的硬核大佬 Russ Cox 表示他一直在研究这个问题,并表示十...

煎鱼阅读 3.5k

打脸了兄弟们,Go1.20 arena 来了!
大家好,我是煎鱼。大概半年前,我写过一篇文章《Go 要违背初心吗?新提案:手动管理内存》。有兴趣了深入解的同学,可以再回顾一下。当时我们还想着 Go 团队应该不会接纳,至少不会那么快:懒得翻也可以看我再次...

煎鱼阅读 3.2k

未上线的猫。

1.4k 声望
130 粉丝
宣传栏