人気ブログランキング
人気ブログランキング
Python PR

Streamlit × EasyOCRで手書き文字認識アプリを作る!リアルタイム画像処理付き!

記事内に商品プロモーションを含む場合があります

1. はじめに

手書き文字認識の技術は、OCR(光学文字認識)の発展によって大きく進化しました。今回は、Pythonの Streamlit を使って、EasyOCR による手書き文字認識アプリを作成します。

さらに、リアルタイムでノイズ除去やコントラスト調整ができるスライダーを搭載 し、認識精度を調整できるようにしました!
このアプリを使えば、ぼかしやしきい値処理をリアルタイムに調整しながらOCRの精度を向上 させることができます。

2. 使用する技術とライブラリ

このプロジェクトでは、以下の技術を使用します。

技術用途
StreamlitWebアプリの構築
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))
sigmaXX方向の標準偏差(数値が大きいほどぼかしが強くなる)

効果

✅ 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結果がどう変わるかを確認!
  • 違う手書きフォントや文字を試して、どの設定が最適か調整!

👉 この記事が役に立ったら、シェアやコメントをお願いします!😊

ABOUT ME
den
完全独学でWEBデザインやpythonアプリ製作や流体解析を無謀にも挑戦している中年男。生成AIのおかげで独学が出来る世の中に感謝。 工場勤務の会社員で3児の父。 チャレンジを忘れず、妻に怒られても心はおれず。 有益な情報を発信し、これを見ている人の為になればと思っています。
関連記事一覧