注
最後まで移動して完全なサンプルコードをダウンロードするか、Binderを介してブラウザでこの例を実行します。
穴埋めとピーク検出#
モルフォロジカル侵食による再構成を使用して、画像内の穴(つまり、孤立した暗いスポット)を埋めます。侵食は、マスク画像に遭遇するまで、シード画像の最小値を拡張します。したがって、シード画像とマスク画像は、再構成された画像の最大値と最小値の可能性を表します。
ピークと穴の両方を含む画像から始めます
import matplotlib.pyplot as plt
from skimage import data
from skimage.exposure import rescale_intensity
image = data.moon()
# Rescale image intensity so that we can see dim features.
image = rescale_intensity(image, in_range=(50, 200))
次に、侵食の開始点を表す極小値があるシード画像を作成する必要があります。穴を埋めるために、シード画像を元の画像の最大値に初期化します。ただし、境界線に沿って、画像の元の値を使用します。これらの境界ピクセルは、侵食プロセスの開始点になります。次に、マスクを元の画像の値に設定して侵食を制限します。
上記に示すように、エッジから内側に侵食すると穴が除去されます。これは、(定義上)穴が明るい値のピクセルで囲まれているためです。最後に、再構成された画像を元の画像から減算することで、暗い領域を分離できます。
あるいは、モルフォロジカル拡張による再構成を使用して、画像の明るいスポットを見つけることができます。拡張は侵食の逆であり、マスク画像に遭遇するまでシード画像の最大値を拡張します。これは逆演算であるため、シード画像を最大画像強度ではなく最小画像強度に初期化します。残りのプロセスは同じです。
seed = np.copy(image)
seed[1:-1, 1:-1] = image.min()
rec = reconstruction(seed, mask, method='dilation')
fig, ax = plt.subplots(2, 2, figsize=(5, 4), sharex=True, sharey=True)
ax = ax.ravel()
ax[0].imshow(image, cmap='gray')
ax[0].set_title('Original image')
ax[0].axis('off')
ax[1].imshow(filled, cmap='gray')
ax[1].set_title('after filling holes')
ax[1].axis('off')
ax[2].imshow(image - filled, cmap='gray')
ax[2].set_title('holes')
ax[2].axis('off')
ax[3].imshow(image - rec, cmap='gray')
ax[3].set_title('peaks')
ax[3].axis('off')
plt.show()

スクリプトの総実行時間:(0分0.461秒)