Skip to content

Tesseract 图像识别

约 1765 字大约 6 分钟

OCR

2025-01-20

Tesseract是一种支持多种图像格式,包括 PNG、JPEG 和 TIFF。的语言识别工具。支持 unicode (UTF-8),并且可以“开箱即用”识别100 多种语言。 Tesseract 支持各种输出格式:纯文本、hOCR (HTML)、PDF、仅不可见文本的 PDF、TSV 和 ALTO(最后一种 - 自版本 4.1.0 以来)。

如何识别图片中文字

要识别纸上面的文字,可以使用OCR(光学字符识别)技术。以下是一些开源OCR框架,可以用于识别纸上面的文字:

  1. Tesseract:Tesseract是由Google开发的OCR引擎,支持多种语言的文本识别,包括英语、中文、日语等。该引擎基于LSTM模型,具有高精度和良好的可扩展性,是目前最流行的OCR引擎之一。Tesseract可以用于图像识别输出文本,目前支持80多种语言。
  2. EasyOCR:EasyOCR是基于Tesseract OCR引擎的OCR识别库,用于图像识别输出文本,目前支持80多种语言。
  3. MMOCR:MMOCR是基于PyTorch和MMDetection的开源工具箱,专注于文本检测、文本识别以及相应的下游任务,如关键信息提取。
  4. simple-ocr-opencv:simple-ocr-opencv是基于OpenCV和Numpy的OCR识别引擎。
  5. OCRmyPDF:OCRmyPDF是基于Tesseract-OCR开发、训练的文字识别提取的开源项目。它可以将扫描或图像文件中的文本转换为可编辑的PDF文档。
  6. Umi-OCR:Umi-OCR是基于PaddleOCR实现的一款开源的文字识别工具。

这些开源框架都是用Python开发的,可以方便地集成到你的项目中。你可以根据需要选择适合的框架来识别纸上面的文字。

下面主要使用Tesseract来测试一下识别效果,官方示例可查看tesseract 示例

注意 现在有些多模态模型也支持传图片识别文字,可以了解一下。

安装

tesseract install

通过brew安装:

$ brew install tesseract

查看版本:

$ tesseract -v
tesseract 5.3.2
 leptonica-1.83.1
  libgif 5.2.1 : libjpeg 8d (libjpeg-turbo 3.0.0) : libpng 1.6.40 : libtiff 4.5.1 : zlib 1.2.11 : libwebp 1.3.1 : libopenjp2 2.5.0
 Found NEON
 Found libarchive 3.6.2 zlib/1.2.11 liblzma/5.4.1 bz2lib/1.0.8 liblz4/1.9.4 libzstd/1.5.4
 Found libcurl/7.79.1 SecureTransport (LibreSSL/3.3.6) zlib/1.2.11 nghttp2/1.45.1

拓展语言包

命令行使用 tesseract --list-langs 命令可查看当前软件支持的语言:

$ tesseract --list-langs
List of available languages in "/opt/homebrew/share/tessdata/" (3):
eng
osd
snum

可以看到不支持简体中文chi_sim,如果这个时候去识别会报错:

$ tesseract ./2023088.jpg - -l chi_sim
Error opening data file /opt/homebrew/share/tessdata/chi_sim.traineddata
Please make sure the TESSDATA_PREFIX environment variable is set to your "tessdata" directory.
Failed loading language 'chi_sim'
Tesseract couldn't load any languages!
Could not initialize tesseract.

tesseract 语言包下载需要的的语言包,下载后将该包直接放在程序安装目录的tessdata文件夹里面即可。

如果使用brew安装的tesseract,可以使用命令安装所有语言包:

$ brew install tesseract-lang
==> Downloading https://formulae.brew.sh/api/formula.jws.json
############################################################################################################### 100.0%
==> Downloading https://formulae.brew.sh/api/cask.jws.json
############################################################################################################### 100.0%
==> Fetching tesseract-lang
==> Downloading https://mirrors.ustc.edu.cn/homebrew-bottles//tesseract-lang-4.1.0.all.bottle.1.tar.gz
############################################################################################################### 100.0%
==> Pouring tesseract-lang-4.1.0.all.bottle.1.tar.gz
🍺  /opt/homebrew/Cellar/tesseract-lang/4.1.0: 164 files, 653.9MB
==> Running `brew cleanup tesseract-lang`...
Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).

再次查看时,就能看到支持的所有语言了

$ tesseract --list-langs
List of available languages in "/opt/homebrew/share/tessdata/" (163):
afr
amh
ara
asm
aze
aze_cyrl
bel
ben
bod
bos
bre
bul
cat
ceb
ces
chi_sim
chi_sim_vert
chi_tra
chi_tra_vert
chr
cos
cym
dan
deu
div
dzo
ell
eng
enm
epo
equ
est
eus
fao
fas
fil
fin
fra
frk
frm
fry
gla
gle
glg
grc
guj
hat
heb
hin
hrv
hun
hye
iku
ind
isl
ita
ita_old
jav
jpn
jpn_vert
kan
kat
kat_old
kaz
khm
kir
kmr
kor
kor_vert
lao
lat
lav
lit
ltz
mal
mar
mkd
mlt
mon
mri
msa
mya
nep
nld
nor
oci
ori
osd
pan
pol
por
pus
que
ron
rus
san
script/Arabic
script/Armenian
script/Bengali
script/Canadian_Aboriginal
script/Cherokee
script/Cyrillic
script/Devanagari
script/Ethiopic
script/Fraktur
script/Georgian
script/Greek
script/Gujarati
script/Gurmukhi
script/HanS
script/HanS_vert
script/HanT
script/HanT_vert
script/Hangul
script/Hangul_vert
script/Hebrew
script/Japanese
script/Japanese_vert
script/Kannada
script/Khmer
script/Lao
script/Latin
script/Malayalam
script/Myanmar
script/Oriya
script/Sinhala
script/Syriac
script/Tamil
script/Telugu
script/Thaana
script/Thai
script/Tibetan
script/Vietnamese
sin
slk
slv
snd
snum
spa
spa_old
sqi
srp
srp_latn
sun
swa
swe
syr
tam
tat
tel
tgk
tha
tir
ton
tur
uig
ukr
urd
uzb
uzb_cyrl
vie
yid
yor

使用

基本使用,-l chi_sim指定识别中文。

$ tesseract ./2023088.jpg - -l chi_sim
Estimating resolution as 488
Detected 86 diacritics
C作 中国福利彩票

CIHINNA WELF及中EL人TTEE可Y
CE4F-D7B2-562B-CFCE-2935A-BBAO-3AO7

中国福和形票 双色于

2023088咱 ST:51010880 SN:12 (〈单式)

OZ OF 11 133 2O 之也本加人[1傍]
销告时汪: 2023/07/31-16:47:04 开奖计间:08701
吉泰路六信人入号 :栋 -上层
第2023087基开奖号仙: 02 35 15 09 17 28+01
骆要码591043154=3248A4FB-D6464F7A-2A310F9F
开奖号但但前: http:V/www.scflcp.com
全赛:2元 感谢您为公瘟事业真献0.72把



四川当福利彩票发行中心承销

识别效果一般。可以参考提高tesseract的输出质量

输出 OCR 所需的时间

$ time tesseract ./2023088.jpg - -l chi_sim+en
Error opening data file /opt/homebrew/share/tessdata/en.traineddata
Please make sure the TESSDATA_PREFIX environment variable is set to your "tessdata" directory.
Failed loading language 'en'
Estimating resolution as 488
Detected 86 diacritics
C作 中国福利彩票

CIHINNA WELF及中EL人TTEE可Y
CE4F-D7B2-562B-CFCE-2935A-BBAO-3AO7

中国福和形票 双色于

2023088咱 ST:51010880 SN:12 (〈单式)

OZ OF 11 133 2O 之也本加人[1傍]
销告时汪: 2023/07/31-16:47:04 开奖计间:08701
吉泰路六信人入号 :栋 -上层
第2023087基开奖号仙: 02 35 15 09 17 28+01
骆要码591043154=3248A4FB-D6464F7A-2A310F9F
开奖号但但前: http:V/www.scflcp.com
全赛:2元 感谢您为公瘟事业真献0.72把



四川当福利彩票发行中心承销

tesseract ./2023088.jpg - -l chi_sim+en  0.91s user 0.03s system 97% cpu 0.960 total

设置白名单

有时我们需要用tesseract-ocr只识别指定类型的数据, 如:仅识别英文字母或数字。此时可设置白名单,让tesseract-ocr只输出我们需要的结果。

打开tesseract-ocr安装路径下的tessdata/configs/digits文件,可以看到里面有一个tessedit_char_whitelist,将其设置成我们需要得到的识别结果。

如:tessedit_char_whitelist ABCD

在调用命令时,需要加上我们设置的文件名:tesseract xxx.png outfilename -psm 6 digits

tesseract提供了OCR引擎模式。有如下四种:

0: 仅限原始Tesseract1: 只有神经网络LSTM2: Tesseract + LSTM3: 基于可用的默认值

目前LSTM是无法支持白名单的

我们需要选择第0种模式,指令如下:

$ tesseract --oem 0 1.png outfileName digits

注意 使用第0种模式会降低识别准确率

可以在转换时设置config。如果是只识别数字,可再加上参数config='--psm 6 --oem 3 -c tessedit_char_whitelist=0123456789'

import pytesseract
from PIL import Image
file = r"/Users/matias/matias/matiasResources/images/jpg/2023088-code.jpg"
image = Image.open(file)
content = pytesseract.image_to_string(image, lang='chi_sim')
content = pytesseract.image_to_string(image, lang='eng+chi_sim')
content = pytesseract.image_to_string(image, lang='eng', config='--psm 6 --oem 3 -c tessedit_char_whitelist=A.0123456789')
print(content)

简单试了一下,识别的准确率还不是很高!还需要优化。

tesseract.js 在TS中的使用

参考

[OCR]tesseract.js 识别图片文字

github tesseract

tesseract install

tesseract 示例

tesseract 文档

tesseract 支持的语言列表

tesseract 语言包

提高tesseract的输出质量