プログラミング の基礎 関数 の 比較 (VBA/Python/JavaScript)
k.w
SEへの道
OCR を実施する際、 精度 が悪いと思うことありませんか? Python で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)
上述結果を踏まえた上で、四辺に空白をいれてみます。
余白(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プログラミング