Python
 Computer >> コンピューター >  >> プログラミング >> Python

ヒステリシス閾値とは?Pythonのscikit-learnを使った実装方法をわかりやすく解説

ヒステリシス閾値とは

ヒステリシス(履歴現象)とは、結果が遅れて現れる遅延効果のことを指します。画像処理における閾値処理の文脈では、ヒステリシスとは「特定の低い閾値以上の領域」または「高い閾値以上の領域」のことを意味します。つまり、高い確信度を持つ領域のみを抽出する手法です。

ヒステリシス閾値を活用することで、画像内の物体のエッジの外側に存在するノイズを無視できるという大きなメリットがあります。これにより、より正確でクリーンなエッジ検出が可能になります。

ここからは、Pythonのscikit-learnライブラリを使用して、ヒステリシス閾値を実現する具体的な方法を見ていきましょう。

実装例

import matplotlib.pyplot as plt
from skimage import data, filters

fig, ax = plt.subplots(nrows=2, ncols=2)
orig_img = data.coins()
edges = filters.sobel(orig_img)
low = 0.1
high = 0.4
lowt = (edges > low).astype(int)
hight = (edges > high).astype(int)
hyst = filters.apply_hysteresis_threshold(edges, low, high)

ax[0, 0].imshow(orig_img, cmap='gray')
ax[0, 0].set_title('Original image')
ax[0, 1].imshow(edges, cmap='magma')
ax[0, 1].set_title('Sobel edges')
ax[1, 0].imshow(lowt, cmap='magma')
ax[1, 0].set_title('Low threshold')
ax[1, 1].imshow(hight + hyst, cmap='magma')
ax[1, 1].set_title('Hysteresis threshold')

for a in ax.ravel():
    a.axis('off')

plt.tight_layout()
plt.show()

実行結果

ヒステリシス閾値とは?Pythonのscikit-learnを使った実装方法をわかりやすく解説

コードの解説

  • まず、matplotlibやskimageなど、必要なライブラリをインポートします。

  • subplots関数を使用して2×2の描画領域を作成し、複数の画像を並べて表示できるようにします。

  • 入力画像には、scikit-learnパッケージに標準で含まれている「coins(硬貨)」のサンプルデータを使用します。

  • sobelフィルタを適用して入力画像のソベル変換を行い、結果の画像でエッジ部分を強調します。

  • 低い閾値(0.1)と高い閾値(0.4)をそれぞれ設定し、apply_hysteresis_threshold関数によって、これらの閾値に基づいた領域を取得します。

  • 最後にimshow関数を使用して、元画像、Sobelエッジ、低閾値のみの結果、ヒステリシス閾値の結果をコンソール上に表示します。

まとめ

ヒステリシス閾値は、単一の閾値によるエッジ検出と比べてノイズに強く、真のエッジを高精度に検出できる手法です。Cannyエッジ検出法でも採用されている考え方であり、scikit-learnのapply_hysteresis_threshold関数を使えば数行のコードで簡単に実装できます。

  1. PythonのSeabornで線形関係を視覚化する方法【regplot・lmplotの使い方を解説】

    Seabornは、データの視覚化を支援するPythonのライブラリです。洗練されたカスタムテーマと高レベルなインターフェースを備えており、美しいグラフを少ないコード量で作成できるのが特徴です。 多重共線性の確認に線形関係の可視化が重要な理由 回帰モデルを構築する際には、多重共線性の有無を確認することが欠かせません。これは、連続変数同士のすべての組み合わせにおける相関関係を把握する必要があるためです。もし変数間に多重共線性が存在する場合は、モデルの精度を損なわないよう、データからその影響を取り除く必要があります。 こうした分析の場面で活躍するのが、「regplot」と「lmplot」という2つの

  2. Pythonのscikit-learnを使って画像の輪郭を検出する方法

    scikit-learn(通称:sklearn)は、機械学習アルゴリズムを実装するために使用されるPythonのライブラリです。オープンソースとして公開されているため、無料で利用できます。このライブラリは、NumPy・SciPy・Matplotlibという3つのライブラリを基盤として構築されています。画像から輪郭を抽出する際には、「マーチングスクエア法(marching squares)」と呼ばれる手法が用いられます。具体的には、skimageライブラリのmeasureモジュールに含まれる「find_contours」関数を使用します。この関数では、配列内の値が線形補間されるため、出力画像にお