2017-02-20 6 views
1

Я использую skimage.segmentation.felzenszwalb, как показано на рисунке here, и это здорово.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 code на номер skimage.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 к, или действительно любое условие, которое Вы хотите! Ключ состоит в создании массива на этой строке, который содержит True в позиции i, когда вы хотите обнулить ярлык i, а False всюду.

Смежные вопросы