👓
pythonでGUIで操作できる簡素なOCRツールを作成してみる
はじめに
資料を作成する時に画像から参考文献のテキストを拾いたいことがあり、
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
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にかけます。
実行するとテキスト化されます。
出力されたテキストはコピーもできます。
chameleonmeme.com/ きっかけは、偶然同じ現場で働いていたエンジニア3人の 「もっと仕事にのめり込んだり、熱中したいよね」という雑談でした。 営業から開発、サービスの提供まですべての工程を自分たちの手で行い、 気の合う仲間と楽しく仕事をすることで熱中するためにチームをスタートしました。
Discussion