2016-04-05 22 views
1

Görüntü için numpy dizisi ve maske olarak bir görüntü var.Fonksiyonu, maskelenmiş numpy dizisine uygula

from scipy.misc import face 

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

Tüm maskeli öğelere nasıl işlev uygulayabilirim?

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

Aslında fonksiyon dönmelidir Maske altındaki her hücre için aralıkta (0, 255) rastgele değer. –

cevap

1

Bu özel işlev için birkaç yaklaşım listelenebilir.

# 1 Yaklaşım: Sen yerinde ayarı için boolean indexing kullanabilirsiniz -

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

Yaklaşım # 2: Ayrıca muhtemelen daha sezgisel çözüm için np.where kullanabilirsiniz -

img_out = np.where(mask,(img*0.5).astype(int),img) 
np.where(mask,A,B) sözdizimi olan np.where ile

,iki eşit şekilli dizi arasında seçim yapıyoruz A ve B ile aynı şekilde yeni bir dizi oluşturmak içinve B. Seçim, A ve B ile aynı şekilde olan mask öğesindeki öğelere göre yapılır. Böylece, mask'daki her True öğesi için A, aksi halde B'u seçiyoruz. Bunu bizim durumumuza çeviren A(img*0.5).astype(int) ve Bimg olur.

Yaklaşım # 3: yerleşik bir tam bu görev için en yakın gibi görünüyor ve yerinde ayarını yapmak için kullanılabilir, şöyle np.putmask Orada var -

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

Çözümler için teşekkür ederiz! Ama bunları başka bir işleve nasıl uygularım? Farz edelim, tüm maskeli hücreler yerine rastgele pikseller üretmem gerekiyor. Bu yöntemleri kullanırsam, tüm maskeye –

+0

Tamam'a bir değer atacağım, anladım. İlk başta, "img" ile aynı büyüklükte bir görüntü oluşturuyorum ve sonra onları maske ile birleştiriyorum. Ans = np.where (maske, noisy_template, img) –

+1

@KatrinaMalakhova Ah Sorunuzu şimdi aldım! :) Evet, noisy_template = np.random.randint (0,255, img.shape) .astype ('uint8') 'ile noisy_template üretebilirsiniz. – Divakar