👓

pythonでGUIで操作できる簡素なOCRツールを作成してみる

2024/04/22に公開

はじめに

資料を作成する時に画像から参考文献のテキストを拾いたいことがあり、
WEBのOCRサービスを利用していたのですが、
通信や処理に時間がかかることもあるのでローカルでそれなりの実行速度と精度のOCRツールを作れないかなと思ったのをきっかけに試しに作成してみました。

概要

画像から文字を読み取る(image to text)には、
OCR(Optical Character Recognition)技術を利用します。
PythonでOCRを実現するには、
TesseractというOSSのOCRエンジンと、
それをPythonで使うためのpytesseractというライブラリを利用します。
また、GUIにはQtというC++のGUIツールキットをPythonで使えるようにしたPyQtを利用します。

前提

  • pythonがインストール済であること
  • pytesseractとPyQt5がインストール済みであること

Tesseractの導入

mac

brew install tesseract
brew install tesseract-lang

win

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

linux

sudo apt install tesseract-ocr

pytesseractの導入

pip install pytesseract

pytesseractの導入

pip install PyQt5

実装

ocr.py
import sys
import pytesseract
from PIL import Image
from PyQt5 import QtWidgets, QtGui

class OCRWindow(QtWidgets.QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):
        self.setWindowTitle('OCRツール')

        # 画像ファイル選択ボタン
        self.file_button = QtWidgets.QPushButton('画像ファイル選択')
        self.file_button.clicked.connect(self.select_file)

        # OCR処理実行ボタン
        self.ocr_button = QtWidgets.QPushButton('OCR処理実行')
        self.ocr_button.clicked.connect(self.run_ocr)

        # 結果表示エリア
        self.result_text = QtWidgets.QTextEdit()

        # レイアウト
        layout = QtWidgets.QVBoxLayout()
        layout.addWidget(self.file_button)
        layout.addWidget(self.ocr_button)
        layout.addWidget(self.result_text)
        self.setLayout(layout)

    def select_file(self):
        filename, _ = QtWidgets.QFileDialog.getOpenFileName(self, '画像ファイル選択', '', '*.png *.jpg')

        if filename:
            self.file_button.setText(filename)

    def run_ocr(self):
        filename = self.file_button.text()

        if not filename:
            return

        # 画像を読み込む
        image = Image.open(filename)

        # OCR処理を実行
        text = pytesseract.image_to_string(image, lang='jpn')

        # 結果を出力
        self.result_text.setText(text)

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)

    window = OCRWindow()
    window.show()

    sys.exit(app.exec_())

実行

作成したファイルをpythonで実行すると

python ./ocr.py

こんな画面が起動します

画像を選択します。試しに以下のエラー文言の画像をOCRにかけます。

実行するとテキスト化されます。
出力されたテキストはコピーもできます。

Discussion