Home >> Blog >> 使用 Pytesseract 的 Tesseract OCR 初學者簡介
使用 Pytesseract 的 Tesseract OCR 初學者簡介
光學字符識別或光學字符讀取器 (OCR) 是將打字、手寫或影印文字的圖像以電子或機械方式轉換為機器編碼文字,無論是來自掃描SEO搜尋引擎優化文檔還是文檔照片。在當今世界,我們不是將資料存儲在紙張和書籍上,而是以數字方式存儲它們,因為電腦硬體現在可以存儲數 TB 的資料,因此我們在 1 GB 的硬碟中存儲數百萬本書沒有問題。OCR 幫助我們掃描圖像、文檔或任何紙質文檔,並將其文字轉換為數字文字形式,而不是手寫或電腦生成的收據。OCR 作為一個過程通常由幾個子過程組成,以盡可能準確地執行。子流程是:
- 圖像預處理
- 文字本地化
- 字符分割
- 字符識別
- 後期處理
上面列表中的子過程當然可以不同,但這些是接近自動字符識別所需的大致步驟。在 OCR 的編寫程式語言中,我們有 tesseract API。它被認為是當時可用的最準確的開源 OCR 引擎之一。它最初是由 Hewlett-Packard 開發的,後來 google 贊助了他們的開發並對其進行了很多改進。在本文中,我們將介紹如何Pytesseract使用 Python 讀取各種掃描文檔。
Pytesseract
Python-tesseract 是 Python 的光學字符識別 (OCR) 工具。也就是說,它將識別並“讀取”圖像中嵌入的文字。
Python-tesseract 是Google’s Tesseract-OCR Engine. 它還可以用作 tesseract 的獨立調用腳本,因為它可以讀取 Pillow 和 Leptonica 成像庫支持的所有圖像類型,包括 jpeg、png、gif、bmp、tiff 等。此外,如果用作腳本,Python-tesseract 將影印識別的文字,而不是將其寫入文件。
安裝:
在 Windows 上安裝 tesseract 非常簡單,只需從這裡下載最新版本。對於 Mac 和 Linux 安裝指南,請訪問此處。安裝後,通過在終端或 cmd 中鍵入命令驗證一切正常
tesseract — version
在此之後,您可以使用 pip 為 tesseract 安裝 python 包裝器。
pip install pytesseract
圖片轉文字
在目錄中創建一個 py 文件並在程式碼編輯器中打開它,第一步我們將加載 bypytesseract模塊和 Pillow 模塊,然後繼續進行圖像到文字部分。
#importing modules
import pytesseract
from PIL import Image
# If you don't have tesseract executable in your PATH, include the following:
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files (x86)\Tesseract-OCR\tesseract'
#converting image to text
print(pytesseract.image_to_string(Image.open('image.png')))
我們已經導入了我們需要的兩個主要模塊pytesseract,接下來,我們在類對像PIL中設置了 tesseract 文件夾的路徑。tesseract_cmd我們在程式碼中使用的 Pil 模塊(Pillow)讀取圖像並將其傳遞pytesseract給識別文字。Pytesseract 類有一個方法名稱image_to_string(),其中我們通過Pilopen 函數傳遞圖像文件名和語言參數,現在我們不傳遞任何語言參數,函數將其設置為默認的英語語言以識別圖像中的文字. 我用來提取文字的圖像在下面給出。
輸出:
The BIG SLEEP
by Raymond Chandler
10 月中旬,大約是上午十一點,陽光沒有
照耀,清澈的山腳下似乎下起了大雨。我
穿著我的粉藍色西裝,深藍色襯衫,領帶和展示
手帕,黑色布洛克鞋,黑色羊毛襪子,上面有深藍色的時鐘。我很整潔,乾淨,刮鬍子而且清醒,我不在乎誰知道。我是穿著考究的私家偵探應有的一切。它要求四百萬美元。“斯特恩伍德莊園的主走廊有兩層樓高。在本可以讓一群印度大象進入的入口門上方,有一塊寬闊的彩色玻璃面板,顯示一名身穿深色盔甲的騎士正在營救
lang=讓我們進一步探索 Pytesseract,我們可以繞過image_to_text 方法中的關鍵字,在tesseract 中處理多種語言。
#importing modules
import pytesseract
from PIL import Image
#reading french text from image
print(pytesseract.image_to_string(Image.open('test-european.jpg'), lang='fra'))
獲取文字框
Pytesseract 可以為您提供 OCR 的邊界框信息。下面的程式碼將為您提供 tesseract 中邊界框檢測中的每個字符或文字。
#importing modules
import pytesseract
from PIL import Image
#bounding box info
print(pytesseract.image_to_boxes(Image.open('planet.png')))
輸出:
O 70 201 98 233 0
R 87 192 109 235 0
B 102 20116 225 0
I 120 201 140 235 0
T 145 201 168 233 0
I 172 201 178 233 0
N 184 20125 0
G 207 192 228 228 225 2 225 0
T 240 T 240 T 240 201 254 230 0
h 258 201 278 234 0
i 284 201 289 233 0
s 294 201 309 225 0
a 323 201 342 225 0
t 346 201 360 230 0
...
...
...
...
a 409 25 42 58 0
. 419 25 450 49 0
得到盒子上的字
如果您想要圍繞單詞而不是字符的框,該功能image_to_data將派上用場。您可以將 image_to_data 函數與pytesseractOutput 指定的輸出類型一起使用。我還添加了我們使用image_to_box方法的相同圖像 planet.png 的輸出。
#importing modules
import pytesseract
from PIL import Image
print(pytesseract.image_to_data(Image.open('planet.png')))
輸出:
level page_num block_num par_num line_num word_num left top width height conf
text
1 1 0 0 0 0 0 0 1417 247 -1
2 1 1 0 0 0 17 12 1357 219 -1
3 1 1 1 0 0 17 12 1357 219 -1
4 1 1 1 1 0 70 12 1294 43 -1
5 1 1 1 1 1 70 12 158 43 95 軌道
5 1 1 1 1 2 240 13 69 33 96 這
5 1 1 1 1 3 323 17 37 29 96 在
5 1 1 1 1 4 374 22 18 24 96 a
5 1 1 1 1 5 408 13 160 33 96 距離
...
...
...
5 1 1 1 4 3 129 193 116 38 96 漂亮
5 1 1 1 4 4 260 193 84 29 95 整潔
5 1 1 1 4 5 359 189 91 33 96 想法。
圖像預處理
有時圖像具有通常無法閱讀的文字,在這種情況下,我們需要使用 Opencv 模塊進行圖像預處理。Python OpenCV 是一個用 C++ 製作的電腦視覺庫。使用此命令pip install python-opencv安裝模塊,下面是我們將從中提取文字的圖像,如果您嘗試使用法線pytesseract,您將不會得到 100 個結果,因為如果您看到的圖像有顏色噪聲和一些光效。
在將圖像提供給 OCR 之前,我們可以做很多操作來改善圖像。下面我只是給你一些想法。檢查以下幾點。
- 將圖像轉換為灰度
- 將圖像轉換為黑白
- 去除噪音
我將應用其中的一些。首先,我將調整圖像的大小以使其更小,然後將其轉換為灰度,最後,通過使用自適應閾值方法將其轉換為黑白來設置閾值。
#importing opencv
import cv2
img = cv2.imread("book_page.jpg")
#Resize the image
img = cv2.resize(img, None, fx=0.5, fy=0.5)
#Convert image to grayscale
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#Convert image to black and white
adaptive_threshold = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 85, 11)
有幾種方法可以分析頁面,tesseract API 提供了頁面分割模式功能,可以分析小區域或不同的頁面方向。要使用頁面分割模式只需簡單地使用關鍵字— psm.我們將使用 tesseract 頁面分割psm 3。而 tesseract 有 13 頁分割模式。
以下是 tesseract 支持的頁面分割模式列表。
0 = 僅方向和腳本檢測 (OSD)。
1 = 使用 OSD 自動進行頁面分割。
2 = 自動頁面分割,但沒有 OSD 或 OCR。
3 = 全自動頁面分割,但沒有 OSD。(默認)
4 = 假設一列可變大小的文字。
5 = 假設一個統一的垂直對齊文字塊。
6 = 假設一個統一的文字塊。
7 = 將圖像視為單個文字行。
8 = 將圖像視為一個單詞。
9 = 將圖像視為圓圈中的單個單詞。
10 = 將圖像視為單個字符。
11 = 稀疏文字。不按特定順序查找盡可能多的文字。
12 = 帶有 OSD 的稀疏文字。
13 = 原始線。將圖像視為單個文字行,繞過特定於 Tesseract 的 hack。
#importing opencv and pytesseract
import cv2
import pytesseract
img = cv2.imread("book_page.jpg")
#Resize the image
img = cv2.resize(img, None, fx=0.5, fy=0.5)
#Convert image to grayscale
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#Convert image to black and white
new_image = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 85, 11)
text = pytesseract.image_to_string(new_image, config="--psm 3")
print(text)
輸出:
實施前設計
特別是如果項目涉及設計產品或服務,請確保您在開始實施之前
在設計階段獲得最佳答案~!
另一個 80/20 規則說,任何設計項目的 20% 的問題/問題會導致 80% 的成本
或超支”!而且以後糾正的成本非常高。
需要大量返工,在 sem 案例中需要重新加工。
輸出被很好地檢測到並且很好,但是它是一些小錯誤,例如您看到一些未知的特殊字符,我們可以應用更多 OpenCV 功能來清除圖像的噪聲並增加 tesseract 的檢測百分比。
最後的想法
到目前為止,我們使用 Python tesseract 包裝器模塊 Pytesseract 學習了 tesseract OCR 的基礎知識。我們已經看到如何使用 OpenCV 函數和 tesseract API 頁面調整函數從圖像中提取簡單文字和從圖像中提取複雜文字。但有時我們有一個文字圖像,例如非常困難的手寫文字或文字驗證碼,它們很難用 tesseract 分析,因此我們需要使用 Opencv 和 tesseract 函數對圖像進行更多調整。因此,通過閱讀他們的官方文檔來更多地探索 tesseract。這篇文章只是讓你對如何使用tesseract以及如何使用電腦視覺來提高檢測百分比有一個基本的了解。我希望這篇文章能在以後對你有所幫助。請隨時分享反饋。