私はnumpyの配列とイメージ用のマスクとしてイメージを持っています。マスクされたnumpyの配列に関数を適用する
from scipy.misc import face
img = face(gray=True)
mask = img > 250
どのようにすべてのマスクされた要素に機能を適用できますか?
def foo(x):
return int(x*0.5)
私はnumpyの配列とイメージ用のマスクとしてイメージを持っています。マスクされたnumpyの配列に関数を適用する
from scipy.misc import face
img = face(gray=True)
mask = img > 250
どのようにすべてのマスクされた要素に機能を適用できますか?
def foo(x):
return int(x*0.5)
このような特定の機能については、いくつかのアプローチを挙げることができます。
#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)
となり、B
はimg
となります。
アプローチ#3:内蔵のこの正確なタスクに最も近いように思わやインプレースの設定を行うために使用することができ、そのようなnp.putmask
することがあります -
np.putmask(img, mask, (img*0.5).astype('uint8'))
ソリューションをありがとうございます!しかし、私はそれらを他の機能にどのように適用しましたか?マスクされたすべてのセルの代わりにランダムなピクセルを生成する必要があるとします。これらのメソッドを使用すると、すべてのマスクに1つの値が割り当てられます。 –
最初は 'img'と同じ大きさのノイズの多い画像を生成し、マスクでそれらをマージします。' ans = np.where(mask、noisy_template、img) ' –
@KatrinaMalakhovaああ、今あなたの質問を受け取りました! :)はい、あなたは 'noisy_template = np.random.randint(0,255、img.shape).astype( 'uint8')'でnoisy_templateを生成することができます。 – Divakar
実際に関数が返す必要がありますマスク下のすべてのセルの範囲(0、255)のランダム値。 –