解析エンジニアの自動化 blog

コツコツと自動化した方法を残す blog

Python + pyocr で ocr したら高認識率で1桁数字も認識した



こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。



この記事の目次



目的


今まで Tesseract を使用して ocr してきました。
この際、 pytesseract という Python から Tesseract を使うためのライブラリを使っていました。

しかし、私のソースコードや操作が悪かったのかもしれませんが、1桁の数字を認識出来ないという問題がありました。

そこで、pyocr という Python から Tesseract を使うためのライブラリを使って ocr してみます。



プログラム

ソースコード


# -*- coding: utf-8 -*-
###############################################################################
# ライブラリインポート
###############################################################################
import os                       # os の情報を扱うライブラリ
from PIL import Image           # 画像処理ライブラリ
import matplotlib.pyplot as plt # データプロット用ライブラリ
import numpy as np              # データ分析用ライブラリ
import pyocr                    # OCR ラッパーライブラリ 対応OCR:Tesseract, Cuneiform
import pyocr.builders           # OCR ラッパーライブラリ 対応OCR:Tesseract, Cuneiform
import sys                      # 実行環境関連ライブラリ
 
# カレントディレクトリを変更する
os.chdir("C:\\作業\ocr-Preprocessing")
 
Image000 = '000_Const_Image.jpg'
 
tools = pyocr.get_available_tools()
if len(tools) == 0:
    print("No OCR tool found")
    sys.exit(1)
 
tool = tools[0]
 
#################### 画像の読み込み ####################
img = Image.open(Image000)
 
txt = tool.image_to_string(
        img,
        lang="eng",
        builder=pyocr.builders.TextBuilder(tesseract_layout=6)
)
 
# 画像を配列に変換
im_list = np.array(img)
 
# データプロットライブラリに貼り付け
plt.imshow(im_list)
 
# 表示
plt.show()
 
# 抽出したテキストの出力
print()
print("text ↓")
print(txt)
print()



画像処理の結果

図1 は WinPython の実行画面、図2 は入力画面と認識文字の比較図です。


図1 WinPython の実行画面


図3 入力画面と認識文字の比較図



コメント

今まで1桁の数字の ocr にすごく苦戦していたのですが、あっさり全部正確に認識しました。

今まで Python + pytesseract では全然認識しなかったのに。

出来るときはこんなものですよね。

資料のデータベースを作成する時に数字の読み取りは必須なので、データベース作成プログラムでも作ってみたいです。



以上

【 ocr の認識率を上げる画像処理】初心者でも簡単な補間



こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。



この記事の目次



目的


補間はノイズ除去の一種だと思います。

ノイズ除去では文字周りに小さな点が散らばっていました。

しかし、いつも文字の周りにあるとは限りません。
文字の中にも小さな点が入り込む事があります。
この記事では、この入り込んだノイズを除去する処理をまとめます。

今回もノイズ除去と同じ様に PythonOpen CV を使って、すごく簡単に補間をやってみます。

収縮、膨張処理を行うので、画像はあらかじめ二値化されていること。また、処理したい線が白であることが必要です。

やり方としては膨張処理を行ってから収縮処理を行うだけです。

ノイズ除去と逆の順番で処理を行うだけです。

今回は Open CV にもともと収縮処理の後に膨張処理を行うメソッドがあるので、そのメソッドを使いますが、自分で膨張処理の後に収縮処理を行うソースコードを書いても出来ます。

ノイズ除去はリンクの記事でまとめています。

【 ocr の認識率を上げる画像処理】初心者でも簡単なノイズ除去 - 解析エンジニアの自動化 blog

また、膨張処理と収縮処理はリンクの記事でまとめています。
なお、リンクの記事で二値化と白黒反転処理もさせているので、参考にしてみてください。

【 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 Interpolation(img):
    kernel = np.ones((2, 2))
    Close_img = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
    return Close_img
 
# カレントディレクトリを変更する
os.chdir("C:\\作業\ocr-Preprocessing")
 
# ファイル名定義
Image000 = '000_Crack_On_Const_Image.jpg'
Image005 = '005_Inv_Crack_On_Const_Image.jpg'
Image010 = '010_CleanUp_Crack_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 = Interpolation(img)
cv2.imwrite(Image010, CleanUp_img)



画像処理の結果

図1 は入力画像、図2 は二値化・白黒反転画像、図3 は補間画像です。


図1 入力画像



図2 二値化・白黒反転画像


図3 補間画像



コメント

図1 と図2 の文字の中にある点々のノイズが図3 にはありません。

文字の欠けていた部分が、補間されています。

文字の中に入り込んでいるノイズの除去とも言えます。

この方法はプログラムがノイズを認識しているわけではないので、使い方には注意が必要です。



以上

【 ocr の認識率を上げる画像処理】初心者でも簡単なノイズ除去



こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。



この記事の目次



目的


ノイズ除去は最も重要な画像処理だと思っています。

今でこそ Python などでライブラリを簡単に使えて誰でもノイズ除去出来ますが、よりキレイで鮮明な画像を追い求めたら、難しさを極めると思います。

でも、この記事では PythonOpen 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 はノイズ除去画像です。


図1 入力画像



図2 二値化・白黒反転画像


図3 ノイズ除去画像



コメント

図1 と図2 にあった点々のノイズが図3 にはありません。

ノイズが除去出来ています。

ただ、文字の線の太さとノイズの大きさが同じくらいだと、この手法は通用しないので、要注意です。



以上

【 ocr の認識率を上げる画像処理】画像をキレイにする基本〜収縮処理〜



こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。



この記事の目次



目的


白色を収縮させて輪郭を小さくする収縮処理というものがあって、収縮処理単体で行うことは少ないが、膨張処理と併用されることでノイズ除去や補間をする事が出来る基本処理として有名な処理です。

この処理は白色を対象に処理されるので、前提として、画像が二値化されていること。また、処理したい線が白であることが必要です。

二値化と白黒反転はリンクの記事でまとめています。
この記事では、収縮処理についてまとめます。

【画像処理】 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 ErosionImageByCV2(img):
    kernel = np.ones((2, 2))
    Ero_img = cv2.erode(img, kernel, iterations = 1)
    return Ero_img
 
# カレントディレクトリを変更する
os.chdir("C:\\作業\ocr-Preprocessing")
 
# ファイル名定義
Image000 = '000_Const_Image.jpg'
Image005 = '005_Inv_Const_Image.jpg'
Image010 = '010_Erosion_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)
 
# 収縮処理
Erosion_img = ErosionImageByCV2(img)
cv2.imwrite(Image010, Erosion_img)



画像処理の結果

図1 は入力画像、図2 は二値化・白黒反転画像、図3 は収縮画像です。


図1 入力画像



図2 二値化・白黒反転画像


図3 膨張画像



コメント

図3 の収縮画像は図2 の二値化・白黒反転画像より、輪郭が小さくなっています。

白色の線が細過ぎた場合、文字が消えちゃうかもしれませんね。



以上

【 ocr の認識率を上げる画像処理】画像をキレイにする基本〜膨張処理〜



こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。



この記事の目次



目的


白色を膨張させて輪郭を大きくする膨張処理というものがあって、膨張処理単体で行うことは少ないが、収縮処理と併用されることでノイズ除去や補間をする事が出来る基本処理として有名な処理です。

この処理は白色を対象に処理されるので、前提として、画像が二値化されていること。また、処理したい線が白であることが必要です。

二値化と白黒反転はリンクの記事でまとめています。
この記事では、膨張処理についてまとめます。

【画像処理】 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 DilationImageByCV2(img):
    kernel = np.ones((2, 2))
    Dil_img = cv2.dilate(img, kernel, iterations = 1)
    return Dil_img
 
# カレントディレクトリを変更する
os.chdir("C:\\作業\ocr-Preprocessing")
 
# ファイル名定義
Image000 = '000_Const_Image.jpg'
Image005 = '005_Inv_Const_Image.jpg'
Image010 = '010_Dilation_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)
 
# 膨張処理
Dilation_img = DilationImageByCV2(img)
cv2.imwrite(Image010, Dilation_img)



画像処理の結果

図1 は入力画像、図2 は二値化・白黒反転画像、図3 は膨張画像です。


図1 入力画像



図2 二値化・白黒反転画像


図3 膨張画像



コメント

図3 の膨張画像は図2 の二値化・白黒反転画像より、輪郭が大きくなっています。

文字が途切れていたり、はっきりしない時にも使えそうですね。



以上

【 ocr の認識率を上げる画像処理】画像のサイズ変更



こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。



この記事の目次



目的


ocr する時に画像処理をしてから ocr する事があると思います。

画像処理の方法にはグレースケール変換、二値化、白黒反転、平滑化、ノイズ除去など色々な方法があります。

しかし、単純だけど地味に良い仕事をしてくれる ocr の認識率を上げる処理方法に画像サイズを大きくする処理があります。

Python で画像サイズの変更方法をまとめます。



プログラム

ソースコード


# -*- coding: utf-8 -*-
###############################################################################
# ライブラリインポート
###############################################################################
import os                       # os の情報を扱うライブラリ
import pytesseract              # tesseract の python 用ライブラリ
from PIL import Image           # 画像処理ライブラリ
 
# 画像のリサイズ関数
def ResizeImage(img, magnification):
    ImgWidth = img.width * magnification
    ImgHeight = img.height * magnification
    img_resize = img.resize((int(ImgWidth), int(ImgHeight)), Image.LANCZOS)
    return img_resize
 
# カレントディレクトリを変更する
os.chdir("C:\\作業\ocr-Preprocessing")
 
# ファイル名定義
Image000 = '001_Const_Image.jpg'
Image010 = '010_Resize_Const_Image.jpg'
 
# pytesseract に tesseract のパスを通す
pytesseract.tesseract_cmd='C:\Program Files (x86)\Tesseract-OCR\tesseract.exe'
 
#################### 画像の読み込み ####################
img = Image.open(Image000)
 
# 画像のリサイズ(画像を 4 倍の大きさに変更)
img_resize = ResizeImage(img, 4)
img_resize.save(Image010)



画像処理の結果

図1 は入力画像で、図2 は出力画像です。

図2 が 4 倍大きくなった画像です。


図1 入力画像


図2 出力画像



コメント

今まで、過去の記事で ocr を行なってきましたが、この処理は単純だけど、 ocr の認識率にはかなり有効な画像処理方法でした。

画像をキレイにする処理もやっていきたいです。



以上

【画像処理】 ocr に必要な色々な画像処理を見据えた白黒反転処理



こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。



この記事の目次



目的


画像の白黒反転処理は重要です。

線を収縮や膨張させる画像処理方法がありますが、この処理は白色を対象に処理されます。

なので、前提として、画像が二値化されていること。また、処理したい線が白であることが必要です。

二値化はリンクの記事でまとめていますので、白黒反転処理についてまとめます。

【画像処理】 ocr の認識率を上げるための二値化 - 解析エンジニアの自動化 blog



プログラム

ソースコード


# -*- coding: utf-8 -*-
###############################################################################
# ライブラリインポート
###############################################################################
import os                       # os の情報を扱うライブラリ
import pytesseract              # tesseract の python 用ライブラリ
from PIL import Image, ImageOps # 画像処理ライブラリ
 
# グレースケール変換関数
def ConversionGrayScale(img):
    gray_img = img.convert('L')
    return gray_img
 
# 二値化(値が 200 未満は 0 にする)関数
def BinarizationImage(img):
    WhiteOnBlack_img = img.point(lambda x:0 if x < 200 else x)
    return WhiteOnBlack_img
 
# 白黒反転関数
def ColorInverter(img):
    img.convert('RGB')
    Inv_img = ImageOps.invert(img)
    return Inv_img
 
# カレントディレクトリを変更する
os.chdir("C:\\作業\ocr-Preprocessing")
 
# ファイル名定義
Image000 = '001_Const_Image.jpg'
Image030 = '030_Black-White_Const_Image.jpg'
 
# pytesseract に tesseract のパスを通す
pytesseract.tesseract_cmd='C:\Program Files (x86)\Tesseract-OCR\tesseract.exe'
 
#################### 画像の読み込み ####################
img = Image.open(Image000)
 
# グレースケール変換
gray_img = ConversionGrayScale(img)
 
# 二値化
Black_img = BinarizationImage(gray_img)
 
# 白黒反転
Inv_img = ColorInverter(Black_img)
Inv_img.save(Image030)



画像処理の結果

図1 は入力画像、図2 は二値化画像、図3 は出力画像です。


図1 入力画像



図2 二値化画像


図3 出力画像



コメント

二値化画像が正確には二値化になってませんが、白黒反転画像が作成出来ました。

二値化画像はいつかなおします。



以上