【 ocr の認識率を上げる画像処理】初心者でも簡単なノイズ除去
こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。
この記事の目次
目的
ノイズ除去は最も重要な画像処理だと思っています。
今でこそ Python などでライブラリを簡単に使えて誰でもノイズ除去出来ますが、よりキレイで鮮明な画像を追い求めたら、難しさを極めると思います。
でも、この記事では Python と Open CV を使って、すごく簡単にノイズ除去をやってみます。
収縮、膨張処理を行うので、画像はあらかじめ二値化されていること。また、処理したい線が白であることが必要です。
やり方としては収縮処理を行ってから膨張処理を行うだけです。
今回は Open CV にもともと収縮処理の後に膨張処理を行うメソッドがあるので、そのメソッドを使いますが、自分で収縮処理の後に膨張処理を行うソースコードを書いても出来ます。
膨張処理と収縮処理はリンクの記事でまとめています。
なお、リンクの記事で二値化と白黒反転処理もさせているので、参考にしてみてください。
【 ocr の認識率を上げる画像処理】画像をキレイにする基本〜膨張処理〜 - 解析エンジニアの自動化 blog
【 ocr の認識率を上げる画像処理】画像をキレイにする基本〜収縮処理〜 - 解析エンジニアの自動化 blog
プログラム
ソースコード
# -*- coding: utf-8 -*-
###############################################################################
# ライブラリインポート
###############################################################################
import os # os の情報を扱うライブラリ
import pytesseract # tesseract の python 用ライブラリ
from PIL import Image, ImageOps # 画像処理ライブラリ
import numpy as np # データ分析用ライブラリ
import cv2 # OpenCV ライブラリ
# 白黒反転関数
def ColorInverter(img):
img.convert('RGB')
Inv_img = ImageOps.invert(img)
return Inv_img
# ノイズ除去(収縮⇒膨張)
def NoiseRemoval(img):
kernel = np.ones((2, 2))
Open_img = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
return Open_img
# カレントディレクトリを変更する
os.chdir("C:\\作業\ocr-Preprocessing")
# ファイル名定義
Image000 = '000_Noise_On_Const_Image.jpg'
Image005 = '005_Inv_Noise_On_Const_Image.jpg'
Image010 = '010_CleanUp_Noise_On_Const_Image.jpg'
# pytesseract に tesseract のパスを通す
pytesseract.tesseract_cmd='C:\Program Files (x86)\Tesseract-OCR\tesseract.exe'
#################### 画像の読み込み ####################
img = Image.open(Image000)
# 白黒反転
Inv_img = ColorInverter(img)
Inv_img.save(Image005)
#################### 画像の読み込み ####################
img = cv2.imread(Image005, 0)
# ノイズ除去(収縮⇒膨張)
CleanUp_img = NoiseRemoval(img)
cv2.imwrite(Image010, CleanUp_img)
コメント
図1 と図2 にあった点々のノイズが図3 にはありません。
ノイズが除去出来ています。
ただ、文字の線の太さとノイズの大きさが同じくらいだと、この手法は通用しないので、要注意です。
以上