Ich versuche, meine Funktion mit numpy zu optimieren. Ich habe ein Array [x, y, 4], das ein RGBA-Bild ist (erhalten von bgra = cv2.cvtColor(bgra, cv2.COLOR_RGB2RGBA)
)
I want to do something like this:
for pixel_row in bgra:
for pixel in pixel_row:
if pixel[0] == 0:
pixel[3] = 0
oder dieses:
for pixel_row in bgra:
for pixel in pixel_row:
if np.array_equal([0,0,0,255], pixel):
pixel[3] = 0
aber mit numpy, das schneller ist als manuelle Iterationen. Ich habe das versucht
bgra = np.where(bgra == [0,0,0,255], [0,0,0,0], bgra)
aber das Ergebnis ist nicht das, was ich erwartet hatte, weil jeder Wert des Pixels einzeln verglichen und ersetzt wird. Ich möchte schwarze Pixel vollständig transparent machen.
Lösung des Problems
Sie können verwenden .all(axis=2)
, um die Bedingung auf der Farbkanalachse zu erzwingen. Anschließend können Sie np.where
mit die Farbkanalachse aktualisieren:
import numpy as np
img = np.zeros((3, 3, 4))
img[..., 3] = 255
img[1, 1] = [1, 2, 3, 255]
new = img.copy()
new[...,3] = np.where((img == [0,0,0,255]).all(axis=2), 0, img[...,3])
print(img, new, sep='\n\n')
The output is:
[[[ 0. 0. 0. 255.]
[ 0. 0. 0. 255.]
[ 0. 0. 0. 255.]]
[[ 0. 0. 0. 255.]
[ 1. 2. 3. 255.]
[ 0. 0. 0. 255.]]
[[ 0. 0. 0. 255.]
[ 0. 0. 0. 255.]
[ 0. 0. 0. 255.]]]
[[[ 0. 0. 0. 0.]
[ 0. 0. 0. 0.]
[ 0. 0. 0. 0.]]
[[ 0. 0. 0. 0.]
[ 1. 2. 3. 255.]
[ 0. 0. 0. 0.]]
[[ 0. 0. 0. 0.]
[ 0. 0. 0. 0.]
[ 0. 0. 0. 0.]]]
Keine Kommentare:
Kommentar veröffentlichen