pytesseract提取識別圖片中的文字


目錄

1、獲取tesseract版本號

2、獲取語言包列表

3、識別圖片中的文字

4、獲取圖片中文字的詳細信息

5、識別圖片中的文字和位置

6、識別osd信息

7、識別並生成xml文件

避坑指南:


 pytesseract是對Tesseract-OCR命令行的封裝,實際上底層調用的還是tesseract可執行文件,所以在使用pytesseract前需要完成Tesseract-OCR軟件安裝和語言包安裝,詳細方法可以參考 Tesseract-OCR5.0軟件安裝和語言包安裝(Windows系統)

pytesseract可以通過pip安裝,當前(2021.11)最新版本為0.3.8:

pip install pytesseract

1、獲取tesseract版本號

get_tesseract_version()獲取tesseract的版本號,注意並不是pytesseract的版本號:

#juzicode.com / VX公眾號:桔子code  
import pytesseract as ts
version = ts.get_tesseract_version()
print('version:',version)

運行結果:

version: 5.0.0-rc1.20211030

結果和在命令行執行”tesseract –version”看到的版本號是一樣的:

E:\juzicode\tess>tesseract --version
tesseract v5.0.0-rc1.20211030

2、獲取語言包列表

通過get_languages()獲取安裝的語言包列表:

#juzicode.com / VX公眾號:桔子code  
import pytesseract as ts
langs = ts.get_languages()
print('langs:',langs)

運行結果:

langs: ['chi_sim', 'eng', 'osd']

和在命令行用“tesseract –list-langs”檢查語言包得到的結果是一樣的:

E:\juzicode\tess>tesseract --list-langs
List of available languages (3):
chi_sim
eng
osd

3、識別圖片中的文字

image_to_string()用來識別圖片中的文字,最簡單的用法傳入2個入參,一個是圖片的文件名稱,一個是識別所用的語言包類型,比如要識別下圖中的文字,這是一段從pdf文件中截屏的片段,文件名為bookseg.png,語言包選擇chi_sim:

img_fn = 'bookseg.png'
lang = 'chi_sim'
text = ts.image_to_string(img_fn,lang)
print(text)

運行結果:

引 言

數 字 圖 像 處 理 方 法 的 重 要 性 源 於 兩 個 主 要 應 用 領 域 : 改 善 圖 示 信 息 以 便 人 們 解 釋 ; 為 存 儲 、 傳
輸 和 表 示 而 對 圖 像 數 據 進 行 處 理 , 以 便 於 機 器 自 動 理 解 。 本 章 有 幾 個 主 要 目 的 : (1) 定 義 我 們 稱 之 為
圖 像 處 理 領 域 的 范 圍 ; (2) 從 歷 史 觀 點 回 顧 圖 像 處 理 的 起 源 ; (3) 通 過 考 察 一 些 主 要 的 應 用 領 域 , 給 出

圖 像 處 理 技 術 狀 況 的 概 念 ; (4) 筒 要 討 論 數 字 圖 像 處 理 中 所 用 的 主 要 方 法 ; (5) 概 述 通 用 目 的 的 典 型 圖
像 處 理 系 統 的 組 成 ; (6) 列 出 公 開 發 表 的 數 字 圖 像 處 理 領 域 的 一 些 圖 書 和 文 獻 。

從這個例子可以看到識別清晰度較高的圖片效果還是非常好的。

除了前面介紹的傳入圖片文件名稱的方法,還可以傳入圖像的numpy數組,這樣就可以和pillow、opencv等模塊配合使用,在某些場合下就可以先用pillow或opencv等做一些預處理再傳入到image_to_string()中識別。

img_fn = 'bookseg.png'
lang = 'chi_sim'
img = cv2.imread(img_fn,0)
cv2.imwrite('gray-bin.jpg',img)
text = ts.image_to_string(img,lang) #第1個參數傳入numpy類型
print(text)

image_to_string()還可以用config參數配置tesseract的命令選項,所有的可選參數組成一個字符串傳給config入參,使用方法為:

text = ts.image_to_string(img,lang,config='--psm 6 --oem 1 --loglevel ALL')

詳細的參數選項有如下幾種,可以通過tesseract的help命令查詢到:

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.
  --dpi VALUE           Specify DPI for input image.
  --loglevel LEVEL      Specify logging level. LEVEL can be
                        ALL, TRACE, DEBUG, INFO, WARN, ERROR, FATAL or OFF.
  -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.

4、獲取圖片中文字的詳細信息

image_to_data()用來獲取識別出來的文字的詳細信息,包含識別到的文本內容,可信度,位置等:

img_fn = 'bookseg.png'
lang = 'chi_sim'
data = ts.image_to_data(img_fn,lang)
print(data)

運行結果:

最后一列是識別出來的文本內容,往前一列是識別出來的可信度,再往前4列是在圖片中的位置,包含left,top,width,height等4個要素。

注意image_to_data()返回的是str類型的數據,如果要使用其中的conf可信度,left,top等位置信息,還需要經過提取、轉換才能得到。

5、識別圖片中的文字和位置

image_to_boxes()用來獲取識別出來的文字和位置信息:

img_fn = 'bookseg.png'
lang = 'chi_sim'
boxes = ts.image_to_boxes(img_fn,lang)
print(boxes)

運行結果:

這種方法得到的位置信息和image_to_data()中得到的left,top,width,height位置信息是一樣的。同樣image_to_data()返回的結果也是一個字符串,如果要使用其中的單個字符和位置信息,也需要進行提取和轉換。

6、識別osd信息

image_to_osd()返回識別到的osd信息:

img_fn = 'bookseg.png'
lang = 'chi_sim'
osd = ts.image_to_osd(img_fn,lang)
print(osd)
print(type(osd))

運行結果:

Page number: 0
Orientation in degrees: 0
Rotate: 0
Orientation confidence: 37.74
Script: Han
Script confidence: 1.43

<class 'str'>

7、識別並生成xml文件

image_to_pdf_or_hocr()可以將識別的文字信息轉為xml格式字節流,從而可以寫入到xml文件中,其中入參extension設置為’hocr’:

img_fn = 'bookseg.png'
lang = 'chi_sim'    
hocr = ts.image_to_pdf_or_hocr(img_fn, lang, extension='hocr')
with open('test.xml', 'w+b') as f:
    f.write(hocr)  
print(type(hocr))

調用image_to_pdf_or_hocr()返回的數據類型為bytes類型,這點和前面幾種方法的返回結果是有差異的,bytes類型可以用wb方式寫入到文件,寫入完成后打開文件可以看該文件包含了識別文字、可信度、位置信息等內容:

原文鏈接:http://www.juzicode.com/image-ocr-pytesseract

避坑指南:

1、提示tesseract未安裝錯誤:

import pytesseract as ts
version = ts.get_tesseract_version()
print('version:',version)

======運行結果
FileNotFoundError: [WinError 2] 系統找不到指定的文件。
......
pytesseract.pytesseract.TesseractNotFoundError: tesseract is not installed or it's not in your PATH. See README file for more information.

原因:一個是沒有安裝tesseract命令行工具,一個是安裝完后沒有把安裝路徑添加到PATH系統變量中。

2、獲取不到支持的語言包:

img_fn = 'bookseg.png'
lang = 'chi_sim'
text = ts.image_to_string(img_fn,lang,config='--tessdata-dir d:\\dev\\Tesseract-OCR5.0.0\\tessdata')
print(text)

======運行結果
pytesseract.pytesseract.TesseractError: (1, 'Error opening data file d:devTesseract-OCR5.0.0tessdata/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.')

使用config參數指定語言包路徑時,不能使用右斜杠,只能使用左斜杠。

#text = ts.image_to_string(img_fn,lang,config='--tessdata-dir d:\\dev\\Tesseract-OCR5.0.0\\tessdata')
text = ts.image_to_string(img_fn,lang,config='--tessdata-dir d:/dev/Tesseract-OCR5.0.0/tessdata')

3、使用–oem 0選項時提示不支持老版本的ocr引擎,需要切換為–oem 1或者不指明oem默認使用新的ocr引擎:


img_fn = 'bookseg.png'
lang = 'eng'
text = ts.image_to_string(img_fn,lang,config='--oem 0')

======運行結果
pytesseract.pytesseract.TesseractError: (1, "Error: Tesseract (legacy) engine requested, 
but components are not present in d:\\dev\\Tesseract-OCR5.0.0/tessdata/eng.traineddata!! 
Failed loading language 'eng' Tesseract couldn't load any languages! Could not initialize tesseract.")

 

推薦閱讀:

有了這個方法群聊斗圖你就不會輸了

只需幾行代碼生成22種風格各異的彩色圖

你別耍我,0.1+0.2居然不等於0.3?

如何實現一個“萬能”的調試打印函數

有了這款神器,什么吃灰文件都統統現形

一行代碼深度定制你的專屬二維碼(amzqr)

桔子菌和超市老板田大爺的一次角色互換經歷

改造getpass,強迫症患者再也不用擔心少輸字符了

來看看怎么用OpenCV解構Twitter大牛的視覺錯覺圖

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM