注意
前往結尾以下載完整的範例程式碼。或透過 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 秒)