GOOGLE ADS

Freitag, 15. April 2022

Elemente im Array ersetzen, wenn eine Bedingung erfüllt ist

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.wheremit 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

Warum werden SCHED_FIFO-Threads derselben physischen CPU zugewiesen, obwohl CPUs im Leerlauf verfügbar sind?

Lösung des Problems Wenn ich das richtig verstehe, versuchen Sie, SCHED_FIFO mit aktiviertem Hyperthreading ("HT") zu verwenden, ...