LoginSignup
20
28

More than 5 years have passed since last update.

pythonでOCRがしたい

Last updated at Posted at 2017-12-24

背景

大学の授業で、プリントやスライドに書かれていることをそのまま打ち込むことが必要な場合が何度かあったので欲しいな、と思い書いてみました。

内容

画像データ読み込み、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)

課題

きれいな画像に関しては、かなりの読み取り精度が取れたが、(誤字はそれなりにあったが、それは学習データの問題かと...)、少しでも質の悪い画像(傾き、影)だとまったく読み取れない。
前処理部のコードに残っているブラーをかけるコード
また、適応閾値アルゴリズムの変更を試したが大きな改善にはならなかった。
膨張、縮小処理を試す。

20
28
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
28