Python

画像 の文字認識に挑戦! 【 Python OCR 】

k.w

Python が使えるようになったなら、 画像 を OCR かけて、文字の抽出!ってやってみたいと思いませんか?画像処理もいろいろできますが、出力された紙、PDFやTIFFなどの画像データから文字を抽出できた時の驚き・・・忘れられません。精度の問題もありますがまずは基本から!

スポンサーリンク

そもそもOCRって?

OCRって何の略?からですが、

  • Optical(オプティカル:光学)
  • Character(キャラクター:文字)
  • Reader(リーダー:読み込み)

を指します。

OCRってなんとなくの雰囲気で使っていましたが、ちゃんと理解すればそのまんまですね。

必要な設定があります!

PythonでOCRを実施する場合、いろいろあるようですが、TesseractOCRが有名です。

これを使えば簡単にできます。

[https://github.com/UB-Mannheim/tesseract/wiki]

設定などは他のサイトが紹介しているので割愛しますが、ポイントは、3つです。

  1. tesseractをインストールする時に必要な言語を取り込むこと
  2. インストールした後、PCの環境変数の設定を忘れないこと
  3. 複数の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に挑戦するのも手ではないでしょうか!

ABOUT ME
記事URLをコピーしました