注
完全なサンプルコードをダウンロードするには、最後に移動してください。または、Binder経由でブラウザでこの例を実行してください
閾値処理#
閾値処理は、グレースケール画像からバイナリ画像を作成するために使用されます [1]。
参照
閾値処理に関するより包括的な説明
import matplotlib.pyplot as plt
from skimage import data
from skimage.filters import threshold_otsu
これらの閾値処理アルゴリズムの1つを適用する方法を説明します。Otsu法[2]は、閾値で分離された2つのピクセルクラス間の分散を最大化することにより、「最適」な閾値(下のヒストグラムで赤い線でマークされています)を計算します。同等に、この閾値はクラス内分散を最小化します。
image = data.camera()
thresh = threshold_otsu(image)
binary = image > thresh
fig, axes = plt.subplots(ncols=3, figsize=(8, 2.5))
ax = axes.ravel()
ax[0] = plt.subplot(1, 3, 1)
ax[1] = plt.subplot(1, 3, 2)
ax[2] = plt.subplot(1, 3, 3, sharex=ax[0], sharey=ax[0])
ax[0].imshow(image, cmap=plt.cm.gray)
ax[0].set_title('Original')
ax[0].axis('off')
ax[1].hist(image.ravel(), bins=256)
ax[1].set_title('Histogram')
ax[1].axvline(thresh, color='r')
ax[2].imshow(binary, cmap=plt.cm.gray)
ax[2].set_title('Thresholded')
ax[2].axis('off')
plt.show()

異なるアルゴリズムの詳細と前提となる仮定に慣れていない場合、どのアルゴリズムが最良の結果をもたらすかを知ることは困難な場合があります。したがって、Scikit-imageには、ライブラリが提供する閾値処理アルゴリズムを評価する機能が含まれています。一目で、メカニズムを深く理解することなく、データに最適なアルゴリズムを選択できます。
from skimage.filters import try_all_threshold
img = data.page()
fig, ax = try_all_threshold(img, figsize=(10, 8), verbose=False)
plt.show()

スクリプトの合計実行時間:(0分1.554秒)