nprogram’s blog

気ままに、プログラミングのトピックについて書いていきます

Python + TesseractでOCR

はじめに

PythonとTesseractでOCRを実施しようとした場合は、日本文字列をそのままOCRに書けるとあまり精度が出ません。

import os
from PIL import Image
from PIL import ImageEnhance
import pyocr
import cv2
import difflib


def start_setting():
    TESSERACT_PATH = r'C:\Program Files\Tesseract-OCR'
    TESSDATA_PATH = r'C:\Program Files\Tesseract-OCR\tessdata'

    os.environ["PATH"] += os.pathsep + TESSERACT_PATH
    os.environ["TESSDATA_PREFIX"] = TESSDATA_PATH


def set_border(before_image, after_image, border: int = 125):
    for x in range(size[0]):
        for y in range(size[1]):
            r, g, b = before_image.getpixel((x, y))
            if r > border or g > border or b > border:
                r = 255
                g = 255
                b = 255
            after_image.putpixel((x, y), (r, g, b))


start_setting()

if not os.path.exists("./Convert"):
    # ディレクトリが存在しない場合、ディレクトリを作成する
    os.makedirs("./Convert")


# pyocrへ利用するOCRエンジンをTesseractに指定する。
tools = pyocr.get_available_tools()
print(tools[0].get_name())
tool = tools[0]
print("Will use tool '%s'" % (tool.get_name()))

# OCR対応言語を確認する
langs = tool.get_available_languages()
print("Available languages: %s" % ", ".join(langs))
lang = langs[0]
print("Will use lang '%s'" % (lang))

# OCR対象の画像ファイルを読み込む
img = Image.open('./Image/jp_text_pattern_modify.png')
img = img.convert('L')
img.save("./Convert/result_gray.jpg")

# コントラストを上げる
enhancer = ImageEnhance.Contrast(img)
img = enhancer.enhance(4.0)
img.save("./Convert/result_gray_contrast.jpg")

# 画像を読みやすいように加工。
img = img.convert('RGB')
size = img.size
border_image = Image.new('RGB', size)

set_border(img, border_image, 230)
border_image.save("./Convert/border_image.jpg")

result_text_from_img = tool.image_to_string(
    border_image,
    lang='jpn',
    builder=pyocr.builders.TextBuilder()
)
# txt is a Python string


print(result_text_from_img)
result_text_from_img = result_text_from_img.replace(' ', '')

word_boxes = tool.image_to_string(
    border_image,
    lang="eng",
    builder=pyocr.builders.WordBoxBuilder()
)


expected = "私のテキスト入力は完璧です。"
diff = difflib.Differ()
diffs = diff.compare(result_text_from_img, expected)

for diff in diffs:
    print(diff)

Open-CV

【python】OpenCVのインストール方法 | 資格マフィア

参考リンク