穴埋めとピーク検出#

モルフォロジカル侵食による再構成を使用して、画像内の穴(つまり、孤立した暗いスポット)を埋めます。侵食は、マスク画像に遭遇するまで、シード画像の最小値を拡張します。したがって、シード画像とマスク画像は、再構成された画像の最大値と最小値の可能性を表します。

ピークと穴の両方を含む画像から始めます

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))

次に、侵食の開始点を表す極小値があるシード画像を作成する必要があります。穴を埋めるために、シード画像を元の画像の最大値に初期化します。ただし、境界線に沿って、画像の元の値を使用します。これらの境界ピクセルは、侵食プロセスの開始点になります。次に、マスクを元の画像の値に設定して侵食を制限します。

import numpy as np
from skimage.morphology import reconstruction

seed = np.copy(image)
seed[1:-1, 1:-1] = image.max()
mask = image

filled = reconstruction(seed, mask, method='erosion')

上記に示すように、エッジから内側に侵食すると穴が除去されます。これは、(定義上)穴が明るい値のピクセルで囲まれているためです。最後に、再構成された画像を元の画像から減算することで、暗い領域を分離できます。

あるいは、モルフォロジカル拡張による再構成を使用して、画像の明るいスポットを見つけることができます。拡張は侵食の逆であり、マスク画像に遭遇するまでシード画像の最大値を拡張します。これは逆演算であるため、シード画像を最大画像強度ではなく最小画像強度に初期化します。残りのプロセスは同じです。

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()
Original image, after filling holes, holes, peaks

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

Sphinx-Galleryによって生成されたギャラリー