#背景
大学の授業で、プリントやスライドに書かれていることをそのまま打ち込むことが必要な場合が何度かあったので欲しいな、と思い書いてみました。
#内容
画像データ読み込み、2値化処理、OCRをpythonを用いて行います。
##OCR前処理
画像をただ読み込むだけでは読み取り精度が取れなかったので、OpenCVを用いて2値化する処理を行います。2値化に関する閾値は手動で行ってもいいのですが、背景に述べた通り、半自動化を目指すので、適応閾値処理(addaptive thresholding)を行います。openCVのドキュメントを参考にします。
import cv2
im = cv2.imread('写真.png')
im_gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
im_blur = cv2.GaussianBlur(im_gray, (5, 5), 0)
th1 = cv2.adaptiveThreshold(im_blur, 255,
cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
cv2.THRESH_BINARY, 11, 2)
##OCR
tesserract-ocrというOCRエンジンをpyocrを用いて利用します。
pyocrのドキュメントにあるInstructionに従えば問題なく利用できます。
ちなみに、PILは画像処理ライブラリであり、様々な処理が可能です。
チートシートがとても参考になります。
が、今回は2値化処理のためにopenCVを使っているため、PILは必要ありません。
import sys
import pyocr
tools = pyocr.get_available_tools()
if len(tools) == 0:
print('No OCR tool found')
sys.exit(1)
tool = tools[0]
txt = tool.image_to_string(
th1,
lang = 'eng+jpn'
)
print(txt)
#課題
きれいな画像に関しては、かなりの読み取り精度が取れたが、(誤字はそれなりにあったが、それは学習データの問題かと...)、少しでも質の悪い画像(傾き、影)だとまったく読み取れない。
前処理部のコードに残っているブラーをかけるコード
また、適応閾値アルゴリズムの変更を試したが大きな改善にはならなかった。
膨張、縮小処理を試す。