rgb-array aus imshow objekt extrahieren

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
G-Rizzle
User
Beiträge: 90
Registriert: Donnerstag 18. Februar 2021, 12:26

Hi!


ich möchte ein 2D-Array aus Höhenwerten in schwarz-weiß plotten. Werte unter einem bestimmten Schwellwert sollen eine eigene Farbe bekommen. Folgender Code erzeugt das gewünschte Ergebnis:

Code: Alles auswählen

custom_cmap = []
for i in range(0, 255):
    custom_cmap.append([i/255, i/255, i/255]) 
custom_cmap = ListedColormap(custom_cmap)

custom_cmap.set_under(color=[112/255,128/255,144/255])

fig, ax = plt.subplots(figsize=(30,15))
 plt.imshow(xyz_dataset_z_coordinates_np, cmap = custom_cmap, 
           vmin = np.amin(xyz_dataset_z_coordinates_np + 1))

ax.set_axis_off()

nun habe ich eine Array maske der selben Dimensionen in x und y, d.h. ein 2D-Array aus Bools, wobei relevante Bereiche mit True, irrlevante mit False besetzt sind.

Diese Maske möchte ich nun auf das imshow-Objekt anwenden. Aus einer vorherigen Programmierung habe ich folgende, funktionierende Funktion, die ein 3D-Array als Bild (3D: ein als mpimg.imread-eingelesenes Bild der Dimension 1024x1024 Pixel hat die Dimension 1024x1024x3, wobei die 3. Dimension den R - G - oder B Wert angibt). An den durch die Maske gekennzeichneten relevanten Bereichen färbt sie den True-Bereich ein.


Code: Alles auswählen

  # helpferfunction to apply a mask with specific color and opacity to the image
def apply_mask(image, mask, color, alpha):

  # override the r-g-b values of the image at the coordinates given from the mask
  for c in range(3):
      image[:, :, c] = np.where(
                                mask == 1,
                                image[:, :, c] *
                                (1 - alpha) + alpha * color[c] * 255,
                                image[:, :, c])
  return image
  
  






Die Funktion apply_mask möchte ich nun mit dem imshow-Objekt füttern, und nicht mit einem als mpimg.imread-eingelesenen Bild. Dazu benötige ich aber ja die RGB-Informationen für jeden Arrayeintrag. Meine Frage ist jetz: kann ich aus dem imshow-Objekt das RGB-Array extrahieren?
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das geht mE nicht. Und warum sollte das gehen? Du kannst doch trivial die Daten, die du imshow zur Darstellung überantwortest, auch einfach an deine Maskierung übergeben.
G-Rizzle
User
Beiträge: 90
Registriert: Donnerstag 18. Februar 2021, 12:26

__deets__ hat geschrieben: Mittwoch 30. März 2022, 11:42 Das geht mE nicht. Und warum sollte das gehen? Du kannst doch trivial die Daten, die du imshow zur Darstellung überantwortest, auch einfach an deine Maskierung übergeben.
was genau meinst du ? verstehe ich nicht ganz
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Na xyz_dataset_z_coordinates_np hast du doch. Das sind doch die Daten. Wieso kannst du die nicht anderweitig weiterveraendern.
G-Rizzle
User
Beiträge: 90
Registriert: Donnerstag 18. Februar 2021, 12:26

__deets__ hat geschrieben: Mittwoch 30. März 2022, 14:35 Na xyz_dataset_z_coordinates_np hast du doch. Das sind doch die Daten. Wieso kannst du die nicht anderweitig weiterveraendern.
Aber ich möchte die Daten ja nicht wirklich verändern, nur die ihnen zugewiesenen Farbwerte. Oder analog zum Einfärben von Punkten unterhalb eines Schwellwerts, Werte innerhalb der Maske fiktiv auf einen sehr hohen Wert setzen und sagen, dass alle Werte in diesem Bereich rot gefärbt sein sollen?
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ja und? Dann kannst du doch Kopien der Daten anlegen. Der Punkt ist: es gibt keine Daten aus dem Objekt. Du musst also basierend auf den ursprünglichen arbeiten.

Und seien mask Funktion muss ja auch nicht verändern. Die kann auch einfach eine maskierte Kopie zurückgeben.
Antworten