広告

pyocr Tesseractで数字のみ取得する方法、ホワイトリストの追加。Python

画像から文字列を取得するのに便利なTesseract OCRですが、ホワイトリストを追加する方法を調べてみるとpyocr Tesseractとpytesseractでconfig追加の方法が異なるので少し混乱しやすいのでメモしておきます。

今回はpyocr Tesseractでのコンフィグの追加方法になります。

builder.tesseract_configs.append("digits")で追加する方法を見つけましたが、この方法ではホワイトリストをTesseract-OCR\tessdata\configs\digitsを編集して使用する必要がありますので、少しアクセス性が悪いかなっと思いますので、次のように書くのがより良いかと思います。

#ホワイトリストの追加
builder.tesseract_configs.append('-c')
builder.tesseract_configs.append('tessedit_char_whitelist="0123456789-.,"')

同じ要領で他のconfigの追加することもできます。

# ページの分割方法の選択
builder.tesseract_configs.append('--psm')
builder.tesseract_configs.append('6') #0~13 
# OCRエンジンの選択
builder.tesseract_configs.append('--oem')
builder.tesseract_configs.append('1') #0~3 

最後にテスト用の画像とpythonコードを置いておきます。

from PIL import Image
import pyocr
import pyocr.builders

# OCRエンジンの取得
pyocr.tesseract.TESSERACT_CMD = 'C:/Tesseract-OCR/tesseract.exe' #tesseract.exeのパス
tools = pyocr.get_available_tools()
tool = tools[0]

#利用可能な言語を表示
print(tool.get_available_languages())

# OCRの準備(テキストの取得)
builder = pyocr.builders.TextBuilder(tesseract_layout=6) #

# ホワイトリストの追加
builder.tesseract_configs.append('-c')
builder.tesseract_configs.append('tessedit_char_whitelist="0123456789-.,"')

# 画像の読み込み
img = Image.open("test_img.jpg")
# 実行            
ocr_text = tool.image_to_string(img, lang="jpn", builder=builder)

print(ocr_text)
#出力結果(ホワイトリストなしの時)
山田君は20,000円のゲームソフトを買い
鈴木君は6.5インチのスマートフォンを35,000円で買いました
二人の使ったお金の合計は55,000円
#出力結果(ホワイトリストありの時)
20,000
6.535,000
55,000

カスタムされたホワイトリストを使い日本語を除外しつつ、コンマやドットを損なわずに出力できました。
(画像サイズによってはドットとコンマの認識の精度はあまりよくありません)

おまけ。
間違えてpytesseractスタイルでconfigの追加をしようとして TypeError: image_to_string() got an unexpected keyword argument 'config'を出してしまい、configが追加できずに永遠とつまづいたことは内緒です(笑)