1. はじめに
手書き文字認識の技術は、OCR(光学文字認識)の発展によって大きく進化しました。今回は、Pythonの Streamlit を使って、EasyOCR による手書き文字認識アプリを作成します。
さらに、リアルタイムでノイズ除去やコントラスト調整ができるスライダーを搭載 し、認識精度を調整できるようにしました!
このアプリを使えば、ぼかしやしきい値処理をリアルタイムに調整しながらOCRの精度を向上 させることができます。
2. 使用する技術とライブラリ
このプロジェクトでは、以下の技術を使用します。
技術 | 用途 |
---|---|
Streamlit | Webアプリの構築 |
EasyOCR | 手書き文字認識(日本語対応) |
OpenCV | 画像の前処理(ノイズ除去・しきい値処理) |
NumPy | 画像データの処理 |
PIL(Pillow) | 画像の読み込み |
3. 事前準備(環境構築)
まずは必要なライブラリをインストールしましょう。
必要なライブラリのインストール
pip install streamlit easyocr opencv-python numpy pillow
もしエラーが出た場合
--user
オプションをつけてインストールし、以下を試してください。
pip install --user easyocr
pip install opencv-python-headless
4. Streamlit × EasyOCR アプリの実装
それでは、実際にコードを書いていきます。
以下のコードを app.py
という名前で保存してください。
app.py
(リアルタイム画像処理付きOCRアプリ)
import streamlit as st
import cv2
import numpy as np
import easyocr
from PIL import Image
# EasyOCRリーダー(日本語 & 英語)
reader = easyocr.Reader(["ja", "en"])
st.title("EasyOCR 手書き文字認識アプリ")
uploaded_file = st.file_uploader("画像をアップロードしてください", type=["png", "jpg", "jpeg"])
if uploaded_file is not None:
# 画像を読み込む
image = Image.open(uploaded_file)
st.image(image, caption="オリジナル画像", use_container_width=True)
# OpenCVで処理するためにNumPy配列に変換
image = np.array(image)
# **グレースケール変換**
gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
st.image(gray, caption="グレースケール画像", use_column_width=True, channels="GRAY")
# **ノイズ除去(ぼかし適用) - スライダーが 0 の場合は適用しない**
ksize = st.slider("ぼかしの強さ (カーネルサイズ)", 0, 15, 5, step=2)
if ksize > 0:
blur = cv2.GaussianBlur(gray, (ksize, ksize), 0)
st.image(blur, caption="ノイズ除去後(ぼかし適用)", use_column_width=True, channels="GRAY")
else:
blur = gray # ぼかしを適用しない
# **適応的しきい値処理(コントラスト強調) - スライダーが 0 の場合は適用しない**
blockSize = st.slider("しきい値計算の領域サイズ", 0, 31, 11, step=2)
C = st.slider("しきい値補正 (C)", 0, 10, 2)
if blockSize > 0 and blockSize % 2 == 1: # blockSizeは奇数でなければならない
binary = cv2.adaptiveThreshold(blur, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, blockSize, C)
st.image(binary, caption="適応的しきい値処理後", use_column_width=True, channels="GRAY")
else:
binary = blur # しきい値処理を適用しない
# **OCRの実行**
results = reader.readtext(binary, detail=0) # `detail=0` はテキストのみ返す
# **認識結果の表示**
st.subheader("認識結果:")
st.text("\n".join(results))
# **OCR対象画像(最終処理後の画像)**
st.image(binary, caption="OCR対象画像(最終処理後)", use_column_width=True, channels="GRAY")
5. アプリの実行
以下のコマンドをターミナル(またはコマンドプロンプト)で実行してください。
streamlit run app.py
6. アプリの特徴
リアルタイム画像処理
- ぼかし(ノイズ除去) をスライダーで調整
- 適応的しきい値処理(コントラスト強調) をスライダーで調整
- 変更結果をリアルタイムで確認しながらOCR精度を向上
OCRの対象を視覚的に確認
- オリジナル画像
- グレースケール画像
- ぼかし適用後の画像
- しきい値処理後の画像
- 最終OCR対象画像
7. OCR精度向上のためのポイント
cv2.GaussianBlur()
の調整
cv2.GaussianBlur()
は、画像のノイズを除去するための平滑化フィルター(ガウシアンフィルター)です。
構文
python
コピーする編集する
cv2.GaussianBlur(src, ksize, sigmaX)
パラメータ | 説明 |
---|---|
src | 入力画像(グレースケール) |
ksize | カーネルサイズ(奇数, 例: (5, 5) , (3, 3) ) |
sigmaX | X方向の標準偏差(数値が大きいほどぼかしが強くなる) |
効果
ksize=(3, 3)
→ ほぼ変化なし(軽微なノイズ除去)
ksize=(5, 5)
→ 一般的なノイズ除去(オススメ)
ksize=(7, 7)
→ 文字がボケる可能性がある(強すぎる)
- ・ぼかしを入れることで ノイズを除去
- ・
ksize=5
(一般的なノイズ除去)がおすすめ
cv2.adaptiveThreshold()
の調整
cv2.adaptiveThreshold()
は、画像のコントラストを強調し、OCRの精度を上げるために使用されます。
構文
cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C)
効果
blockSize=11, C=2
→ 標準的なしきい値処理
blockSize=15, C=4
→ より強調されたコントラスト
blockSize=21, C=8
→ 文字が強調されすぎる可能性あり
blockSize
(しきい値計算の領域サイズ)を 15, 21, 25 などにすると文字が強調されやすい
C
(しきい値補正値)は 2 ~ 5 が適切
8. まとめ
Streamlit × EasyOCR を使うことで、手書き文字認識アプリを簡単に作成 できました!
リアルタイムでノイズ除去やコントラストを調整 することで、最適なOCR結果を得られます!
試してみてください!
- スライダーを動かして、OCR結果がどう変わるかを確認!
- 違う手書きフォントや文字を試して、どの設定が最適か調整!
この記事が役に立ったら、シェアやコメントをお願いします!
