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

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

【 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 出力画像



コメント

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

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



以上

【画像処理】 ocr の認識率を上げるための二値化



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



この記事の目次



目的


二値化は画像処理ではかなり良く出てくる処理です。
リンクの記事でグレースケール変換を纏めましたが、二値化はグレースケール変換した画像に対して行います。

ocr の認識率を上げるためのグレースケール変換 - 解析エンジニアの自動化 blog

画像の二値化をまとめます。



プログラム

ソースコード


# -*- coding: utf-8 -*-
###############################################################################
# ライブラリインポート
###############################################################################
import os                       # os の情報を扱うライブラリ
import pytesseract              # tesseract の python 用ライブラリ
from PIL import Image           # 画像処理ライブラリ
 
# グレースケール変換関数
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
 
# カレントディレクトリを変更する
os.chdir("C:\\作業\ocr-Preprocessing")
 
# ファイル名定義
Image000 = '001_Const_Image.jpg'
Image020 = '020_WhiteOnBlack_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)
Black_img.save(Image020)



画像処理の結果

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


図1 入力画像


図2 出力画像



コメント

カラー画像が白黒画像に…なってませんね。

二値化関数はコメントの通り、値が 200 未満は 0 にしていますが、200 以上はそのままで何も処理をしていませんでした。 255 にしないと二値化になりません。



以上

ocr の認識率を上げるためのグレースケール変換



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



この記事の目次



目的


私は Tesseract を使って ocr しています。
Tesseract のみでの ocr でも、かなり認識率は高いほうだと感じています。
ですか、やはり限界はあります。

そこで、認識率を上げるための画像処理にどういったものがあるのかを調べてみました。

グレースケール変換をまとめます。



プログラム

ソースコード


# -*- coding: utf-8 -*-
###############################################################################
# ライブラリインポート
###############################################################################
import os                       # os の情報を扱うライブラリ
import pytesseract              # tesseract の python 用ライブラリ
from PIL import Image           # 画像処理ライブラリ
 
# グレースケール変換関数
def ConversionGrayScale(img):
    gray_img = img.convert('L')
    return gray_img
 
# カレントディレクトリを変更する
os.chdir("C:\\作業\ocr-Preprocessing")
 
# ファイル名定義
Image000 = '001_Const_Image.jpg'
Image010 = '010_gray_Const_Image.jpg'
 
# pytesseract に tesseract のパスを通す
pytesseract.tesseract_cmd='C:\Program Files (x86)\Tesseract-OCR\tesseract.exe'
 
#################### 画像の読み込み ####################
img = Image.open(Image000)
 
# グレースケール変換
gray_img = ConversionGrayScale(img)
gray_img.save(Image010)



画像処理の結果

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


図1 入力画像


図2 出力画像



コメント

カラー画像がグレースケール画像に変換されました。
グレースケール変換処理だけ行うことは少ないと思いますが、必ずどこかで出てくる処理です。



以上

罫線の無い 10 行 10 列の等間隔整列したサイズの大きい文字の画像を大きくリサイズして ocr してみる(Python + Tesseract)



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



この記事の目次



目的


リンクの記事で罫線の無い表の ocr で画像サイズを大きくすると文字認識率がどう変わるのかを調べてみました。
拡大前画像と拡大後画像で 1 桁の数字を除く誤認識数が 75 % 減少しました。

罫線の無い 10 行 10 列の等間隔整列した文字の画像を大きくリサイズして ocr してみる(Python + Tesseract) - 解析エンジニアの自動化 blog

今回はフォントサイズを大きくした罫線の無い等間隔整列する文字の表の画像サイズを 2 倍にするとどのくらいの正解率になりそうか確認します。



プログラム

ソースコード〜画像拡大〜


# -*- coding: utf-8 -*-
###############################################################################
# ライブラリインポート
###############################################################################
import os                       # os の情報を扱うライブラリ
from PIL import Image           # 画像処理ライブラリ
 
# カレントディレクトリを変更する
os.chdir("C:\\作業")
 
# 画像の読み込み
img = Image.open('C:\作業\ocr\ocr-test3.jpg')
 
# 画像のリサイズ
img_resize = img.resize((int(img.width*2), int(img.height*2)), Image.LANCZOS)
 
# 画像の保存
img_resize.save('C:\作業\ocr\ocr-test3-resize.jpg')


拡大した画像

リンクの記事で ocr した画像の ocr-test3.jpg を 2 倍の大きさにして、 ocr-test3-resize.jpg として保存します。

ocr するならやっぱり大きい文字の方が良い - 解析エンジニアの自動化 blog



図1 拡大した画像


ソースコードocr


# -*- coding: utf-8 -*-
###############################################################################
# ライブラリインポート
###############################################################################
import os                       # os の情報を扱うライブラリ
import pytesseract              # tesseract の python 用ライブラリ
from PIL import Image           # 画像処理ライブラリ
import matplotlib.pyplot as plt # データプロット用ライブラリ
import numpy as np              # データ分析用ライブラリ
 
# カレントディレクトリを変更する
os.chdir("C:\\作業")
 
# pytesseract に tesseract のパスを通す
pytesseract.tesseract_cmd='C:\Program Files (x86)\Tesseract-OCR\tesseract.exe'
 
# 画像の読み込み
img = Image.open('C:\作業\ocr-test3-resize.jpg')
 
# 画像を配列に変換
im_list = np.array(img)
 
# データプロットライブラリに貼り付け
plt.imshow(im_list)
 
# 表示
plt.show()
 
# テキスト抽出
txt = pytesseract.image_to_string(img)
 
# 抽出したテキストの出力
print()
print(txt)
print()



ocr の結果

図2 は ocr の結果をまとめた表です。

基本的に 1 桁の数字が読み取れていません。

また、『 3 ⇨ 8 』の誤認識数が増えました。

図2 ocr の結果まとめ表



コメント

1 桁の数字を認識しませんでした。
1 桁の数字を認識させる方法が課題です。

画像を拡大しても必ずしも誤認識しやすい文字の認識率は上がらないことがわかった。



以上

罫線の無い 10 行 10 列の等間隔整列した文字の画像を大きくリサイズして ocr してみる(Python + Tesseract)



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



この記事の目次



目的


リンクの記事で 罫線入りの表の ocr で画像サイズを大きくすると文字認識率がどう変わるのかを調べてみました。
拡大前画像では全く意味不明な文字として認識したのに拡大後画像では 1 桁の数字以外と間違えやすい文字の『 3 』、『 5 』、『 7 』、『 8 』以外の文字は読み取れました。

罫線入りの 10 行 10 列の表の画像を大きくリサイズして ocr してみる(Python + Tesseract) - 解析エンジニアの自動化 blog

今回は罫線の無い等間隔整列する文字の表の画像サイズを 2 倍にするとどのくらいの正解率になりそうか確認します。



プログラム

ソースコード〜画像拡大〜


# -*- coding: utf-8 -*-
###############################################################################
# ライブラリインポート
###############################################################################
import os                       # os の情報を扱うライブラリ
from PIL import Image           # 画像処理ライブラリ
 
# カレントディレクトリを変更する
os.chdir("C:\\作業")
 
# 画像の読み込み
img = Image.open('C:\作業\ocr\ocr-test2.jpg')
 
# 画像のリサイズ
img_resize = img.resize((int(img.width*2), int(img.height*2)), Image.LANCZOS)
 
# 画像の保存
img_resize.save('C:\作業\ocr\ocr-test2-resize.jpg')


拡大した画像

リンクの記事で ocr した画像の ocr-test2.jpg を 2 倍の大きさにして、 ocr-test2-resize.jpg として保存します。

ocr ( Python + Tesseract ) で惨敗した - 解析エンジニアの自動化 blog



図1 拡大した画像


ソースコードocr


# -*- coding: utf-8 -*-
###############################################################################
# ライブラリインポート
###############################################################################
import os                       # os の情報を扱うライブラリ
import pytesseract              # tesseract の python 用ライブラリ
from PIL import Image           # 画像処理ライブラリ
import matplotlib.pyplot as plt # データプロット用ライブラリ
import numpy as np              # データ分析用ライブラリ
 
# カレントディレクトリを変更する
os.chdir("C:\\作業")
 
# pytesseract に tesseract のパスを通す
pytesseract.tesseract_cmd='C:\Program Files (x86)\Tesseract-OCR\tesseract.exe'
 
# 画像の読み込み
img = Image.open('C:\作業\ocr-test2-resize.jpg')
 
# 画像を配列に変換
im_list = np.array(img)
 
# データプロットライブラリに貼り付け
plt.imshow(im_list)
 
# 表示
plt.show()
 
# テキスト抽出
txt = pytesseract.image_to_string(img)
 
# 抽出したテキストの出力
print()
print(txt)
print()



ocr の結果

図2 は ocr の結果をまとめた表です。

基本的に 1 桁の数字が読み取れていません。

また、一部の『 3 ⇨ 8 』と誤認識しました。


図2 ocr の結果まとめ表



コメント

1 桁の数字を認識しませんでした。

何か 1 桁の数字を認識させる方法を考えます。

また、拡大前画像と拡大後画像では 1 桁の数字を除き、誤認識数は 75 % 減少しました。



以上