wake-up-neo.com

Wie wähle ich alle nicht schwarzen Pixel in einem NumPy-Array aus?

Ich versuche mit NumPy eine Liste der Pixel eines Bildes zu erhalten, die sich von einer bestimmten Farbe unterscheiden.

Während Sie beispielsweise das folgende Bild verarbeiten:

 enter image description here

Ich habe es geschafft, eine Liste aller schwarzen Pixel zu erhalten:

np.where(np.all(mask == [0,0,0], axis=-1))

Aber wenn ich versuche zu tun:

np.where(np.all(mask != [0,0,0], axis=-1))

Ich bekomme ein ziemlich seltsames Ergebnis:

 enter image description here

Es sieht so aus, als hätte NumPy nur die Indizes zurückgegeben, bei denen R, G und B nicht 0 sind

Hier ist ein minimales Beispiel, was ich versuche zu tun:

import numpy as np
import cv2

# Read mask
mask = cv2.imread("path/to/img")
excluded_color = [0,0,0]

# Try to get indices of pixel with different colors
indices_list = np.where(np.all(mask != excluded_color, axis=-1))

# For some reason, the list doesn't contain all different colors
print("excluded indices are", indices_list)

# Visualization
mask[indices_list] = [255,255,255]

cv2.imshow(mask)
cv2.waitKey(0)
4
ofir dubi

Verwenden Sie np.any anstelle von np.all für den zweiten Fall der Auswahl aller außer schwarzen Pixel: 

np.any(image != [0, 0, 0], axis=-1)

Oder Sie erhalten einfach ein Komplement aus schwarzen Pixeln, indem Sie ein boolesches Array mit ~ : invertieren. 

black_pixels_mask = np.all(image == [0, 0, 0], axis=-1)
non_black_pixels_mask = ~black_pixels_mask

Arbeitsbeispiel:  

import numpy as np
import matplotlib.pyplot as plt


image = plt.imread('example.png')
plt.imshow(image)
plt.show()

 enter image description here

image_copy = image.copy()

black_pixels_mask = np.all(image == [0, 0, 0], axis=-1)

non_black_pixels_mask = np.any(image != [0, 0, 0], axis=-1)  
# or non_black_pixels_mask = ~black_pixels_mask

image_copy[black_pixels_mask] = [255, 255, 255]
image_copy[non_black_pixels_mask] = [0, 0, 0]

plt.imshow(image_copy)
plt.show()

 enter image description here


Falls jemand Matplotlib zur Darstellung der Ergebnisse verwendet und ein vollständig schwarzes Bild oder Warnungen erhält, lesen Sie diesen Beitrag: Das Konvertieren aller nicht-schwarzen Pixel in eine Farbe führt nicht zu einer erwarteten Ausgabe.

5
Georgy

Notwendigkeit: Matrix mit dieser Form benötigen = (any, any, 3)

Lösung:

COLOR = (255,0,0)
indices = np.where(np.all(mask == COLOR, axis=-1))
indexes = Zip(indices[0], indices[1])
for i in indexes:
    print(i)

Lösung 2:

holen Sie sich das Intervall einer bestimmten Farbe, zum Beispiel ROT:

COLOR1 = [250,0,0]
COLOR2 = [260,0,0] # doesnt matter its over limit

indices1 = np.where(np.all(mask >= COLOR1, axis=-1))
indexes1 = Zip(indices[0], indices[1])

indices2 = np.where(np.all(mask <= COLOR2, axis=-1))
indexes2 = Zip(indices[0], indices[1])

# You now want indexes that are in both indexes1 and indexes2

Lösung 3 - BEWÄHRTE ARBEIT  

Wenn vorherige nicht funktioniert, gibt es eine Lösung, die zu 100% funktioniert.

Umwandlung vom RGB-Kanal in HSV. Erstellen Sie eine 2D-Maske aus einem 3D-Bild. Die 2D-Maske enthält den Farbtonwert. Der Vergleich von Farbtönen ist einfacher als bei RGB, da Farbton 1 ist, während RGB Vektor mit 3 Werten ist. Wenn Sie eine 2D-Matrix mit Farbtonwerten haben, machen Sie es wie oben beschrieben:

HUE1 = 0.5
HUE2 = 0.7 

indices1 = np.where(HUEmask >= HUE1)
indexes1 = Zip(indices[0], indices[1])

indices2 = np.where(HUEmask <= HUE2)
indexes2 = Zip(indices[0], indices[1])

Sie können das gleiche für Sättigung und Wert machen.

0
Martin