画像 の文字認識に挑戦! 【 Python OCR 】
Python が使えるようになったなら、 画像 を OCR かけて、文字の抽出!ってやってみたいと思いませんか?画像処理もいろいろできますが、出力された紙、PDFやTIFFなどの画像データから文字を抽出できた時の驚き・・・忘れられません。精度の問題もありますがまずは基本から!
そもそもOCRって?
OCRって何の略?からですが、
- Optical(オプティカル:光学)
- Character(キャラクター:文字)
- Reader(リーダー:読み込み)
を指します。
OCRってなんとなくの雰囲気で使っていましたが、ちゃんと理解すればそのまんまですね。
必要な設定があります!
PythonでOCRを実施する場合、いろいろあるようですが、TesseractOCRが有名です。
これを使えば簡単にできます。
[https://github.com/UB-Mannheim/tesseract/wiki]
設定などは他のサイトが紹介しているので割愛しますが、ポイントは、3つです。
- tesseractをインストールする時に必要な言語を取り込むこと
- インストールした後、PCの環境変数の設定を忘れないこと
- 複数のOCRソフトがインストールされているときは注意すること
一度設定してしまえば、次回以降は設定不要なのですが、PC更新時や異なる環境で実施する場合のあるあるですのでご注意を。
OCRは設定と一文のコードで!
では、さっそくサンプルコードの紹介です。
サンプルコード
/* import設定 */
import os
import sys
import pyocr
import glob
import configparser as cfg
import cv2
import pytesseract
/* Config設定 */
user = os.getlogin()
cfg = cfg.ConfigParser()
cfg.read('config.ini', 'UTF-8')
/* OCR設定 */
tools = pyocr.get_available_tools()
if len(tools) == 0:
print("No OCR tool found")
sys.exit(1)
tool = tools[0]
lang = 'eng', 'jpn'
print(tool.get_name())
/* File読み込みフォルダ指定 */
files = glob.glob(cfg.get(user, 'img_folder') +
'/cell_cut/*.jpg', recursive=True)
print(files)
for file in files:
img = cv2.imread(file)
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ocr = pytesseract.image_to_string(gray_img, lang='eng', config='--psm 6')
print('OCR:' + ocr)*/
補足説明
設定の部分は、16~21行目です。
PCにインストールされているOCRの有無を確認します。
tesseractを認識していれば、22行目で “Tesseract(sh)” と出力されます。(もし複数インストールされている場合は、異なる設定が読み込まれています。)
OCR実施は、32行目の一文だけ!
えっ?それだけ?と思われるかもしれませんが、それだけなんです。
読み込む画像、言語(lang)、設定(config)の3つの引数からなっています。
読み込む画像と言語はそのままなので説明割愛しますが、言語はインストールする際に設定した言語を指定してください。
設定については、psm0~13がありますが、psm0とpsm2はOCRが行われませんので選ぶことは基本ないと思います。
psm3 :完全自動ページセグメンテーション
(OSD※なし)-Default
※Orientation and script detection:文字方向および書字系の検出
psm4 :単一カラムの様々なサイズのテキストとみなす
psm5 :垂直方向に整列した単一カラムの均一ブロックテキストとみなす
psm6 :単一カラムの均一ブロックテキストとみなす
psm7 :画像を単一行のテキストとして扱う
psm8 :画像を単語1つのみ含まれるものとして扱う
psm10: 画像を1文字のだけが含まれるものとして扱う
引数を指定しない場合はデフォルトでpsm3となります。
まずは、デフォルトで実行し、適宜調整するのがよいでしょう。
良く使うものを紹介します。(他はネットで検索すればでてくるので割愛します)
画像や文字書式によって認識率はかわりますが、その中でもpsm6を良く使いますね。
明らかに一つの文字ならpsm10などうまく使い分けることが必要です。
Pythonの入門にOCRはおすすめ
いかがですか?ひと昔前なら特殊技術やソフトがなければできなかったものが、自分のPCで手軽にOCRが出来るようになったのです。
時代の進歩には驚きですね。
自分で考えた通りに結果が出力されるのか?
各種設定を調整して意図通りに出力された時の快感!
興味を持たれた方は、OCRからPythonに挑戦するのも手ではないでしょうか!