2013-09-16 11 views
7

このフォーラムでは、画像などのマスクされた配列の中央値の計算についていくつかの議論がありました。私が望むのはやや微妙です。イメージにメジアンフィルタを適用することです。私はそれを行う方法を知っていますが、それほど遅く、プロセスをスピードアップする方法を高く評価します。マスクされた配列のメジアンフィルタ

例えば、のマスク済み(10,10)の配列があり、マスクされた要素を使用しないボックス(3,3)でメディアンフィルタを適用したいとします。私の目標は、画像の各ピクセルの値をボックスのマスクされたメジアンの値で置き換えることです。実際に我々がブルートフォース途中でそれを行うことができメディアンフィルタを作るために、今すぐ

im = numpy.random.uniform(size=(10,10)) 
mask = numpy.zeros_like(im) 
mask[1:3,:] = 1 
masked_im = numpy.ma.array(im, mask=mask) 

非常に単純なケースを想定すると、私たちは、「画像」ととしてマスクを構築することができ

lx, ly = im.shape 
side = 3 
im_filt = numpy.zeros_like(im) 
for jj in range(ly): 
    for ii in range(lx): 
     minx, maxx = max([ii-side/2,0]), min([ii+side/2+1,lx]) 
     miny, maxy = max([jj-side/2,0]), min([jj+side/2+1,ly]) 
     im_filt[ii,jj] = numpy.ma.median(masked_im[minx:maxx, miny:maxy]) 

これは問題を解決し、良い結果をもたらしますが、私が言ったように、それは痛いほど遅いです。

im_filt2 = numpy.zeros_like(im) 
for jj in range(ly): 
    for ii in range(lx): 
     minx, maxx = max([ii-side/2,0]), min([ii+side/2+1,lx]) 
     miny, maxy = max([jj-side/2,0]), min([jj+side/2+1,ly]) 
     zoom_im = im[minx:maxx, miny:maxy] 
     zoom_msk = mask[minx:maxx, miny:maxy] 
     im_filt2[ii,jj] = numpy.median(zoom_im[zoom_msk == 0]) 

これは、なぜ明らかに優れている0.002から0.018から実行時間を、(もたらす:ややプロセスをスピードアップするための一つの(私には、意外な)方法は次のように、個別にマスクや画像を使用することですか? ?)私が探していたファクター〜50でないならば。

入力がありますか?

答えて

1

私は、主にMaskedArrayオブジェクト(ndarrayの周りのラッパー)にアクセスする際のオーバーヘッドが原因であると考えています。

numpyの効率的なメディアンフィルタの場合は、scikit-imageも試してみてください。また、マスク引数を受け取ります。

+0

これは[skimage.filter.rank](http://scikit-image.org/docs/dev/api/skimage.filter.rank.html#median)パッケージに含まれています。 – letmaik

+0

上記の2つのリンクはもう動作していないようです。 – JoVe

+0

報告いただきありがとうございます。新しいリンクがあります:http://scikit-image.org/docs/stable/api/skimage.filters.rank.html#median – btel

関連する問題