OCR文字辨識

      在〈OCR文字辨識〉中留言功能已關閉

OCR引擎(Optical Character Recognition 光學字元辨識)

tesseract[`tesərækt](四度空間)為HP實驗室於1985年開始研發,至1995年時已經成為OCR業內最準確的三款識別引擎之一。HP後來放棄OCR業務,Tesseract停止研發。數年後,HP將Tesseract貢獻給開源軟件業.。2005年 Tesseract由美國內華達州信息技術研究所獲得,並求諸於Google對Tesseract進行改進、消除Bug、優化工作。

Tesseract可以指定下載要辨識的語言,所以屬於離線作業,辨識時並不需網路取得文字資料。

安裝引擎

Windows環境

在Windows下,tesseract引擎可由如下網址下載
https://digi.bib.uni-mannheim.de/tesseract/

請選取最新且非dev,非alpha的版本。目前最新版本為 tesseract-ocr-w64-setup-v5.0.1.20220107.exe安裝時, 請選取 Additional language data(download),然後勾選要支援的語言。

最後請將 “C:\Program Files\Tesseract-OCR” 加到系統變數Path中。
請注意,Path設定好後,Pycharm必需關閉重新啟動,上面的Path才會重新生效。

另外請注意,安裝Additional language data時會出現錯誤,無法安裝,請依下述方式手動新增訓練資料

Linux環境

在ubuntu裏要安裝OCR引擎,只需如下指令即可

sudo apt-get tesseract-ocr

安裝中文字型訓練資料

上述安裝tesseract引擎時,選取Additional language data時,會出現錯誤。請到 https://github.com/tesseract-ocr/tessdata 選取chi_tra.traineddata ,然後按下Download

然後把 chi_tra.traineddata copy 到 C:\Program Files\Tesseract-OCR\tessdata 目錄之下即可

Python套件安裝

pip install pytesseract, pillow

pytesseract只是一個使用Python包裝起來的套件,它只負責將圖片傳給OCR引擎,然後接收OCR引擎轉換後傳出的文字而以。而Pillow是Image圖形處理套件。

pytesseract.image_to_string(image, lang=’chi_tra’)

首先使用urllib自網路上下載圖片。urllib是系統就安裝好的套件,無需另行下載。置入tesseract的影像image必需為OpenCv的影像格式,且轉成灰階256後的效果更為精準。

import pytesseract
from urllib.request import urlopen
import numpy as np
import cv2
url='http://mahaljsp.asuscomm.com/wp-content/uploads/2020/12/scikt_data.jpg'
resp = urlopen(url)
image = np.asarray(bytearray(resp.read()), dtype="uint8")
image = cv2.imdecode(image, cv2.IMREAD_GRAYSCALE)

result=pytesseract.image_to_string(image, lang='chi_tra')
print(result)

cv2.imshow('title', image)
cv2.waitKey(0)

結果 : 
Load_digits skLearn.datasets._base
load_boston skLearn.datasets._base
load_diabetes skLearn.datasets._base
load_fiues skLearn.datasets._base
load_inris skLearn.datasets._base
load_breast_cancer skLearn.datasets._base
load_linnerud skLearn.datasets._base
load_sample_image(image_name) skLearn.datasets._base
load_sample_images() skLearn.datasets._base
1oad_svmlight_file skLearn.datasets._svmLight_format_io
Load_svmuight_fiLes “skLearn.datasets._svmLight_format_10
skLearn.datasets._base
Load_wine

lang為指令要辨識的語言,如下所示

chi_sim : 簡体中文
chi_tra : 繁体中文
eng : 英文
fra : 法文

準確度

tesserocr僅能解決實心的圖形文字, 對於空心的文字依然無法辨識. 畢竟電腦不是人腦, 只能使用深度學習訓練機器識別

PIL圖片處理

圖片顏色過於複雜, 也會影響辨識的效果. 而且tesseract引擎對灰階的辨識度比彩色還高, 所以需先將彩色圖片先轉成灰階256色圖片, 若再不行, 再轉成二值化圖片.

所以二值化圖片是設定一個門檻值, 低於此值就變為 0 (黑色), 高於此值就變為1(白色).

import pytesseract
from PIL import Image
import requests
from io import BytesIO
response = requests.get("https://login.sina.com.cn/cgi/pin.php?r=9967937&s=0&p=gz-d0dc363f6a4523cbd602a5a10f00c59b4784")
image = Image.open(BytesIO(response.content))
image = image.convert('L')#轉成灰階256色

#底下是二值化處理
threshold = 180
table = []

for i in range(256):
    if i < threshold:
        table.append(0)
    else:
        table.append(1)
# 將表格轉成二進制圖片, 1的作用是白色,不然就全部黑色
image = image.point(table, "1")
image.show()

result=pytesseract.image_to_string(image,lang='eng')
print(result)

圖片反白

要將圖片反白, 可以使用如下方式

from PIL import ImageOps
image = ImageOps.invert(image)
image.show()

簡繁轉換

下載套件

langconv.py : /files/langconv.py
zh_wiki.py : /files/zh_wiki.py

作法

from langconv import Coverter
str_sp='测试'
str_td=Converter('zh-hant').convert(str_sp)
print('簡轉繁'+str_td)

str_td="測試"
str_sp=Converter('zh-hans').convert(str_td)
print('簡轉繁'+str_sp)

todo

https://www.itread01.com/articles/1476089156.html