2017-02-20 12 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

skimage.morphology.remove_small_objectssource codeをご覧ください。前処理/入力クリーニングは数多くありますが、ビジネスの終了は非常に簡単です。 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_bigtoo_smallを変更したり、本当にあなたが望む任意の条件をすることができます!キーは、ラベルiをゼロにするときはいつでもポジションiにTrueを含む配列を生成し、他の場所ではFalseを生成することです。

関連する問題