2016-04-05 14 views
1

Ich habe ein Bild als numpy Array und eine Maske für das Bild.Funktion auf maskiertes numpy Array anwenden

Wie kann ich Funktion auf alle maskierten Elemente anwenden?

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

Eigentlich sollte Funktion zurückgeben zufälliger Wert im Bereich (0, 255) für jede Zelle unter Maske. –

Antwort

1

Für diese spezielle Funktion könnten nur wenige Ansätze aufgelistet werden.

Ansatz # 1: Sie boolean indexing für in-Place-Einstellung verwenden -

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

Ansatz # 2: Sie auch np.where für eine möglicherweise mehr intuitive Lösung verwenden -

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

Mit dieser np.where, die eine Syntax von np.where(mask,A,B) hat, wählen wir zwischen zwei gleichförmigen Arrays A und B, um ein neues Array mit der gleichen Form wie A und B zu erzeugen. Die Auswahl erfolgt basierend auf den Elementen in mask, die wiederum die gleiche Form wie A und B haben. So wählen wir für jedes True Element in maskA, andernfalls B. Übersetzen Sie dies zu unserem Fall, A wäre (img*0.5).astype(int) und B ist img.

Ansatz # 3: einen eingebauten in np.putmask Es gibt, die am nächsten für diese genaue Aufgabe zu sein scheint und verwendet werden könnten, in-Place-Einstellung zu tun, wie so -

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

Vielen Dank für die Lösungen! Aber wie habe ich sie auf andere Funktionen angewendet? Angenommen, ich muss zufällige Pixel anstelle aller maskierten Zellen erzeugen. Wenn ich diese Methoden verwende, wird allen Masken ein Wert zugewiesen. –

+0

Ok, ich habe es verstanden. Zuerst erzeuge ich ein verrauschtes Bild mit der gleichen Größe wie 'img' und dann füge ich sie mit der Maske' ans = np.with (mask, noisy_template, img) ' –

+1

@KatrinaMalakhova ein. Ah, ich habe deine Frage jetzt bekommen! :) Also ja, du kannst noisy_template mit 'noisy_template = np.random.randint (0,255, img.shape) .astype ('uint8')' erzeugen. – Divakar