【画像処理】 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)
コメント
二値化画像が正確には二値化になってませんが、白黒反転画像が作成出来ました。
二値化画像はいつかなおします。
以上
【画像処理】 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)
コメント
カラー画像が白黒画像に…なってませんね。
二値化関数はコメントの通り、値が 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)
コメント
カラー画像がグレースケール画像に変換されました。
グレースケール変換処理だけ行うことは少ないと思いますが、必ずどこかで出てくる処理です。
以上
罫線の無い 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
ソースコード〜 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()
コメント
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
ソースコード〜 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()
コメント
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
ソースコード〜 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 』
コメント
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 の結果
図2 は ocr の結果をキャプチャした画像です。
図3 は 図2 を比較表にまとめた画像です。
なぜかフォントサイズが 12 ポイントが 1 番認識率が良く全文字列を正しく認識しました。
【フォントサイズ別まとめ】
『 フォントサイズ 11 : 誤認識 3 箇所 』
『 フォントサイズ 12 : 誤認識 0 箇所 』
『 フォントサイズ 14 : 誤認識 1 箇所 』
コメント
フォントサイズ 12 ポイントの誤認識は 2 箇所かなぁって思ってたら、予想外に全正解となりました。
でも、フォントサイズは大きい方が認識しやすい結果となった…と言っていいと思います。
今後、単純に画像サイズを大きくすればより認識率が向上出来るのか確認します。
以上