簡體   English   中英

Skimage合並過度分割的區域

[英]Skimage merge over-segmented regions

我正在嘗試將此圖像分為九個單獨的區域(重疊的圓形區域)。 由於圓圈重疊,我認為分水嶺分割將是最好的方法。 我按照這個scikit-image.org示例在圖像上執行該技術,並且圖像被過度分割,並且得到了10個分段,而不是9個分段,如通過ndi.labels函數檢查的那樣。

在peak_local_max函數中增加覆蓋區的大小會引起分段不足的問題,因此我認為最好是分段過度,然后合並應該是單個區域的區域。 您可以在提供的輸出中看到,第八個圓被分為兩個單獨的區域。 我使用了regionprops函數來繪制邊界框。

segmented_image_example.png

import matplotlib.pyplot as plt
from scipy import ndimage as ndi

from skimage import io, img_as_uint
from skimage.filters import median, threshold_minimum
from skimage.morphology import disk, square, closing, watershed
from skimage.feature import peak_local_max


image_bw = ('example_binary.tif')

distance = ndi.distance_transform_edt(image_bw)
local_maxi_disk10 = peak_local_max(distance, indices=False, 
                                   footprint=np.ones((400, 400)), 
                                   labels=image_bw)

markers, num_features = ndi.label(local_maxi_disk10)
labels = watershed(-distance, markers, mask=image_bw)
print('Number of features (ndi.label):', num_features)

fig, axes = plt.subplots(1, 3, figsize=(10, 4), sharex=True, sharey=True)
ax = axes.ravel()

ax[0].imshow(image_bw)
ax[0].set_title('Image Binary')
ax[1].imshow(-distance)
ax[1].set_title('Distances')
ax[2].imshow(labels)
ax[2].set_title('Separated objects')

for a in ax:
    a.set_axis_off()

plt.tight_layout()
plt.show()

最終目標是獲取屬於每個圓的圖像部分,並將其另存為自己的圖像,因此要合並不完整的區域,我可以將它們的邊界框加在一起。 但是,似乎應該有一種方法可以組合來自區域屬性的多個區域,甚至可以組合分水嶺過程本身的不同標簽。 任何人都可以通過合並區域/標簽來幫助我向正確的方向指出如何做到這一點嗎? 我還將附加使用的二進制圖像。

example_binary.tif

您可能可以使用區域鄰接圖(RAG) ,然后根據一些標准[1] [2] [3]合並節點。 但是,找到正確的標准通常很困難。

如果要手動執行,可以使用NumPy索引進行:

import numpy as np

def merge_labels(labels_image,
                 labels_to_merge,
                 label_after_merge):
    labels_map = np.arange(np.max(labels_image) + 1)
    labels_map[labels_to_merge] = label_after_merge
    return labels_map[labels_image]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM