Streamlit との連携 -- 画像二値化GUIアプリケーション


Streamlit を使用してグラフィカルに画像二値化を行うアプリケーションのサンプルです。

画像はファイルアップローダーから選択して読み込むことができます。 二値化しきい値はスライダーにより操作できます。

本サンプルの実行には予め Streamlit をインストールしておく必要があります。 pip コマンドを使用する場合、次のようにインストールしてください。

pip install streamlit==0.82.0

コード

import pyfie
import streamlit as st

# PyFIE 関数が返すエラーコードに応じて例外を発生させる機能を有効化
pyfie.ctrl.enable_f_err_exception(True)

# GUIで調整可能なパラメータ
threshold = st.sidebar.slider("二値化しきい値", 0, 255, 128, 1)
uploaded_file = st.sidebar.file_uploader(
    '画像ファイル選択', type=["bmp", "png", "jpg", "jpeg", "tif", "tiff"])
use_column_width = st.sidebar.checkbox('画像をウィンドウ幅に合わせて表示')


@st.cache
def load_img_file(file):
    """ファイルから画像を読み込む。

    読み込み結果をキャッシュすることで、
    二値化パラメータだけを変えたときに画像が再読み込みされることを防いでいる。"""
    return pyfie.imdecode(file.read())


if uploaded_file is not None:
    with st.spinner('画像を読み込み中...'):
        himg = load_img_file(uploaded_file)

    if himg.f_type != pyfie.F_IMG_UC8 or himg.ch != 1:
        st.text("エラー:画像がUC8型1チャネルではありません。")
    else:
        # 入力画像を表示
        # デフォルトではウィンドウ幅まで画像が縮小されてしまうので、
        # 縮小されないように調整する
        image = st.image(himg.ndarray, caption="入力画像",
                         width=himg.width, use_column_width=use_column_width)
        # 二値化実行
        hbin = himg.empty_like(pyfie.F_IMG_BIN)
        pyfie.fnFIE_binarize(himg, hbin, threshold)
        # 出力画像を表示
        bin_image = st.image(
            hbin.clone_to_ndarray() * 255, caption="二値画像", output_format="PNG",
            width=himg.width, use_column_width=use_column_width)
else:
    st.text("サイドバーから画像を選択してください。")

コードの実行には下記のコマンドを使用します。 このコードのファイル名は sample_streamlit.py とします。

streamlit run sample_streamlit.py

スクリーンキャスト(2倍速)

../../_images/streamlit_screencast.gif

ダウンロード

関連サンプル