2016-04-05 21 views
1

私はnumpyの配列とイメージ用のマスクとしてイメージを持っています。マスクされたnumpyの配列に関数を適用する

from scipy.misc import face 

img = face(gray=True) 
mask = img > 250 

どのようにすべてのマスクされた要素に機能を適用できますか?

def foo(x): 
    return int(x*0.5) 
+0

実際に関数が返す必要がありますマスク下のすべてのセルの範囲(0、255)のランダム値。 –

答えて

1

このような特定の機能については、いくつかのアプローチを挙げることができます。

#1 アプローチ:あなたはインプレース設定にboolean indexingを使用することができます -

img[mask] = (img[mask]*0.5).astype(int) 

アプローチ#2:あなたはまた、おそらくより直感的な解決のためにnp.whereを使用することができます -

img_out = np.where(mask,(img*0.5).astype(int),img) 

np.where(mask,A,B)の構文を持つnp.whereでは、2つの等しい形状の配列の中から選択していますAおよびBを使用して、AおよびBと同じ形状の新しい配列を生成します。この選択は、maskの要素に基づいて行われ、AおよびBと同じ形状です。したがって、の要素がmaskにある場合は、Aを選択します。それ以外の場合はBとなります。これを当社のケースに翻訳すると、A(img*0.5).astype(int)となり、Bimgとなります。

アプローチ#3:内蔵のこの正確なタスクに最も近いように思わやインプレースの設定を行うために使用することができ、そのようなnp.putmaskすることがあります -

np.putmask(img, mask, (img*0.5).astype('uint8')) 
+0

ソリューションをありがとうございます!しかし、私はそれらを他の機能にどのように適用しましたか?マスクされたすべてのセルの代わりにランダムなピクセルを生成する必要があるとします。これらのメソッドを使用すると、すべてのマスクに1つの値が割り当てられます。 –

+0

最初は 'img'と同じ大きさのノイズの多い画像を生成し、マスクでそれらをマージします。' ans = np.where(mask、noisy_template、img) ' –

+1

@KatrinaMalakhovaああ、今あなたの質問を受け取りました! :)はい、あなたは 'noisy_template = np.random.randint(0,255、img.shape).astype( 'uint8')'でnoisy_templateを生成することができます。 – Divakar

関連する問題