Python

OCR の時のひと手間 余白 で 精度 向上!【 Python OCR】

Kuni.W

OCR を実施する際、 精度 が悪いと思うことありませんか? Python でOCRを色々試した結果、画像ギリギリ文字があると認識率が悪いように思います。ただ、 余白 を入れることで文字認識があがるようなんです。くっきりと文字を認識できるからでしょうか?ぜひお試しを。

スポンサーリンク

画像ギリギリのOCR結果

サンプル画像

もちろん、目で見ると 123.45 です。

わかりにくいですが、画像は下側のように端がギリギリな場合を想定しました。

しかし、OCRを実施した結果は、 123 45(.の部分が空白)として認識されました。

OCRを実施したサンプルソースは以下参照ください。

/* import設定
import os
import sys
import pyocr
import glob
import configparser as cfg
import cv2
import pytesseract

/* Config設定 */
user = os.getlogin()
cfg = cfg.ConfigParser()
cfg.read('config.ini', 'UTF-8')

/* OCR設定 */
tools = pyocr.get_available_tools()
if len(tools) == 0:
    print("No OCR tool found")
    sys.exit(1)
tool = tools[0]
lang = 'eng', 'jpn'
print(tool.get_name())

/* File読み込みフォルダ指定 */
files = glob.glob(cfg.get(user, 'img_folder') +
                  '/cell_cut/*.jpg', recursive=True)
print(files)

for file in files:
    img = cv2.imread(file)
    gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    ocr = pytesseract.image_to_string(gray_img, lang='eng', config='--psm 6')
    print('OCR:' + ocr)

余白を入れた時のOCR結果

上述結果を踏まえた上で、四辺に空白をいれてみます。

余白(4辺 5px)を入れた画像は以下です。
(下部にオリジナルを再度掲載します。)

ちょっとした違いなのですが、結果としては効果があるようです。

ちゃんと 123.45 と . を読み込んでいます。

余白をいれたサンプルソースは以下となります。

/* import設定 */
import os
import sys
import pyocr
import glob
import configparser as cfg
import cv2
import pytesseract
import numpy as np

/* Config設定 */
user = os.getlogin()
cfg = cfg.ConfigParser()
cfg.read('config.ini', 'UTF-8')

/* OCR設定 */
tools = pyocr.get_available_tools()
if len(tools) == 0:
    print("No OCR tool found")
    sys.exit(1)
tool = tools[0]
lang = 'eng', 'jpn'
print(tool.get_name())

/* File読み込みフォルダ指定 */
files = glob.glob(cfg.get(user, 'img_folder') +
                  '/cell_cut/*.jpg', recursive=True)
print(files)

for file in files:
    img = cv2.imread(file)
    gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    height, width = gray_img.shape
    white_w_img = np.ones((5, width), np.uint8)*255
    gray_img = cv2.vconcat([white_w_img, gray_img, white_w_img])
    height, width = gray_img.shape
    white_h_img = np.ones((height, 5), np.uint8)*255
    gray_img = cv2.hconcat([white_h_img, gray_img, white_h_img])

    ocr = pytesseract.image_to_string(gray_img, lang='eng', config='--psm 6')
    print('OCR:' + ocr)*/

34~39行目で、OCR画像のサイズを取得し、Numpyにて余白を 5pxずつ左右、上下に vconcat,hconcatで結合しています。

 

いかがでしょうか?

ちょっとしたことかもしれませんが、OCR結果が意図通りではない場合は試してみて損はないと思います。

OCRは本当に奥が深いですね。
OpenCVの基本を学ばれたい方にお勧め!
基本的なコマンドについて記載されています。

Pythonで始めるOpenCV 4プログラミング

ABOUT ME
記事URLをコピーしました