2017-02-20 58 views
1

我使用的skimage.segmentation.felzenszwalbhere所示,它很棒。scikit-image - felzenszwalb分割:刪除大段

我儘可能地調整了參數,但它仍然檢測到一些我不想要的細節。我如何才能刪除超過一定大小的細分市場?我知道你可以使用skimage.measure.regionprops來獲得每個片段的面積,但我不知道如何從segments_fz中刪除一個片段,讓陣列保持爲mark_boundaries

import numpy as np 
import skimage.io 
from skimage.util import img_as_float 
from skimage.segmentation import felzenszwalb 
from skimage.segmentation import mark_boundaries 

img = img_as_float(astronaut()[::2, ::2]) 
segments_fz = felzenszwalb(img, scale=100, sigma=0.5, min_size=50) 

print("Felzenszwalb number of segments: {}".format(len(np.unique(segments_fz)))) 

segmented_img = mark_boundaries(img, segments_fz) 
skimage.io.imsave('img_labeled.png', segmented_img) 

這類似於this post,但他們正試圖刪除,而不是路數小物件。

回答

1

看看source codeskimage.morphology.remove_small_objects。有很多預處理/輸入清理,但業務結束非常簡單。假設segments是細分標籤,您輸入的圖像,這裏是什麼功能做:

out = np.copy(segments) 
component_sizes = np.bincount(segments.ravel()) 
too_small = component_sizes < min_size 
too_small_mask = too_small[segments] 
out[too_small_mask] = 0 
return out 

您可以更改too_smalltoo_big,或者真的是你想要的任何條件!關鍵是要在位置i處包含True的那條線上生成一個數組,無論何時您想要將標籤i和False都歸零。