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

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

【画像処理】 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 % 減少しました。



以上

罫線入りの 10 行 10 列の表の画像を大きくリサイズして ocr してみる(Python + Tesseract)



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



この記事の目次



目的


リンクの記事で Python + Tesseract を使った ocr について動作確認とフォントサイズの違いによる文字認識率について調べてみました。
間違えやすい文字が『 3 』、『 5 』、『 8 』を筆頭に大体の傾向が分かりました。

フォントサイズが ocr の認識率に与える影響についてのまとめ(Python + Tesseract) - 解析エンジニアの自動化 blog

今回は画像サイズを 2 倍にするとどのくらいの正解率になりそうか確認します。



プログラム

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


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


拡大した画像

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

ちなみに元々の画像のフォントは『 MS P ゴシック 』でフォントサイズは 11 ポイントです。

初心者が Python で初めての 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-test1- 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 』
『 7 ⇨ T 』


図2 ocr の結果まとめ表



コメント

1 桁の数字を読み込まない原因が分かりません。
誤認識でも良いから認識さえしてくれていればまだ良かったのですが…

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



以上

フォントサイズが ocr の認識率に与える影響についてのまとめ(Python + Tesseract)



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



この記事の目次



目的


リンクの記事でフォントサイズ 11 ポイントで 2 行 6 列の表を ocr しました。
残念ながら間違えやすい『 3 』、『 5 』、『 8 』の 3 箇所を誤認識していました。

文字認識でフォントサイズの違いは正解率にどのくらい影響するか - 解析エンジニアの自動化 blog

今回はフォントサイズが 12 ポイントだとどのくらいの正解率になりそうか確認します。



プログラム

ソースコード


# -*- 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-test1.jpg')
#img = Image.open('C:\作業\ocr-test2.png')
#img = Image.open('C:\作業\ocr-test3.png')
#img = Image.open('C:\作業\ocr-test4.png')
#img = Image.open('C:\作業\ocr-test5.png')
#img = Image.open('C:\作業\ocr-test6.png')
#img = Image.open('C:\作業\ocr-test7.png')
#img = Image.open('C:\作業\ocr-test8.png')
#img = Image.open('C:\作業\ocr-test9.png')
#img = Image.open('C:\作業\ocr-test10.png')
img = Image.open('C:\作業\ocr-test11.png')

# 画像を配列に変換
im_list = np.array(img)
 
# データプロットライブラリに貼り付け
plt.imshow(im_list)
 
# 表示
plt.show()
 
# テキスト抽出
txt = pytesseract.image_to_string(img)
 
# 抽出したテキストの出力
print()
print(txt)
print()

使い方

画像の読み込みについては何回も失敗に失敗を重ねて 11 枚の画像を作りました。 1 つの記事には出来そうに無いので、1 つの記事で 1 画像ずつ紹介していきます。

コメントを意味する ♯ を順に付けていきながら、読み込む画像を変えて ocr していきました。

その他の Python ソースコードについてはソースコードのコメントに処理内容を書いたので、説明は割愛します。



ocr する画像

図1 のエクセルで作った画像を ocr しました。
フォントは『 MS Pゴシック 』で、サイズは 12 ポイントです。

図1 ocr する画像



ocr の結果

図2 は ocr の結果をキャプチャした画像です。
図3 は 図2 を比較表にまとめた画像です。

なぜかフォントサイズが 12 ポイントが 1 番認識率が良く全文字列を正しく認識しました。

【フォントサイズ別まとめ】
『 フォントサイズ 11 : 誤認識 3 箇所 』
『 フォントサイズ 12 : 誤認識 0 箇所 』
『 フォントサイズ 14 : 誤認識 1 箇所 』


図2 ocr の結果


図3 ocr の結果まとめ表



コメント

フォントサイズ 12 ポイントの誤認識は 2 箇所かなぁって思ってたら、予想外に全正解となりました。
でも、フォントサイズは大きい方が認識しやすい結果となった…と言っていいと思います。
今後、単純に画像サイズを大きくすればより認識率が向上出来るのか確認します。



以上

文字認識でフォントサイズの違いは正解率にどのくらい影響するか



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



この記事の目次



目的


リンクの記事で 2 行 6 例の小さい表のを ocr を再チャレンジしました。
残念ながら 1 箇所だけ誤認識していました。

【再チャレンジ】 2 行 6 列の表の文字認識(Python + Tesseract) - 解析エンジニアの自動化 blog

今回はフォントサイズがどのくらいだと高い正解率を保てそうか確認するため、表の大きさは変えずにフォントサイズを変えた 2 行 6 列の表で認識出来るか Pythonocr してみます。



プログラム

ソースコード


# -*- 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-test1.jpg')
#img = Image.open('C:\作業\ocr-test2.png')
#img = Image.open('C:\作業\ocr-test3.png')
#img = Image.open('C:\作業\ocr-test4.png')
#img = Image.open('C:\作業\ocr-test5.png')
#img = Image.open('C:\作業\ocr-test6.png')
#img = Image.open('C:\作業\ocr-test7.png')
#img = Image.open('C:\作業\ocr-test8.png')
#img = Image.open('C:\作業\ocr-test9.png')
img = Image.open('C:\作業\ocr-test10.png')
#img = Image.open('C:\作業\ocr-test11.png')

# 画像を配列に変換
im_list = np.array(img)
 
# データプロットライブラリに貼り付け
plt.imshow(im_list)
 
# 表示
plt.show()
 
# テキスト抽出
txt = pytesseract.image_to_string(img)
 
# 抽出したテキストの出力
print()
print(txt)
print()

使い方

画像の読み込みについては何回も失敗に失敗を重ねて 11 枚の画像を作りました。 1 つの記事には出来そうに無いので、1 つの記事で 1 画像ずつ紹介していきます。

コメントを意味する ♯ を順に付けていきながら、読み込む画像を変えて ocr していきました。

その他の Python ソースコードについてはソースコードのコメントに処理内容を書いたので、説明は割愛します。



ocr する画像

図1 のエクセルで作った画像を ocr しました。
フォントは『 MS Pゴシック 』で、サイズは 11 ポイントです。

図1 ocr する画像



ocr の結果

図2 は ocr の結果をキャプチャした画像です。
図3 は 図2 を比較表にまとめた画像です。

前の記事からフォントサイズを変えたのですが、誤認識の割合が増えました。

【誤認識の詳細】
『 30 』を『 so 』
『 50 』を『 so 』
『 80 』を『 E0 』


図2 ocr の結果


図3 ocr の結果まとめ表



コメント

かなり正しく読み込めていて、間違えやすい文字以外は正しく読み取れています。

今回のフォントサイズが 11 ポイントなので、次は、 12 ポイントにフォントサイズを変えた表で ocr します。



以上