jpg speichern ohne Hintergrund

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 eine Heatmap speichern, die ich in Matplotlib erstellt habe. Momentan sieht das Ergebnis so aus:

Bild


Nun wäre es wichtig, den weißen Hintergrund zu entfernen. Wie erreiche ich, dass tatsächlich NUR der Bereich als Bild gespeichert wird, der nicht weiß ist?

Code:

Code: Alles auswählen

plt.style.use('seaborn')
        plt.scatter(x=datensatzverarbeitung_modul.datensatzverarbeiter_obj.x_vektor, y=datensatzverarbeitung_modul.datensatzverarbeiter_obj.y_vektor,
                    s=1,  # Durchmesser Der Datenpunkte
                    c=self.plot_farbliste  # Farbe
                    )
        plt.axis('off')
        plt.savefig("test.jpg")
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ist die Frage, wie du deine blobs erkennst? Oder wie du dein Bild mit transparenten Bereichen speicherst? Letzteres geht nicht mit JPEG. Sondern mit PNG zB. Ersteres musst du mal in die OpenCV Doku schauen, da gibt’s zb canny edge der weiterhelfen könnte. Oder diverse blob erkenner.
G-Rizzle
User
Beiträge: 90
Registriert: Donnerstag 18. Februar 2021, 12:26

__deets__ hat geschrieben: Donnerstag 13. Januar 2022, 19:49 Ist die Frage, wie du deine blobs erkennst? Oder wie du dein Bild mit transparenten Bereichen speicherst? Letzteres geht nicht mit JPEG. Sondern mit PNG zB. Ersteres musst du mal in die OpenCV Doku schauen, da gibt’s zb canny edge der weiterhelfen könnte. Oder diverse blob erkenner.

es geht darum, den weißen rand nicht mitzuspeichern, sondern wirklich lediglich das "bild". also den dunklen bereich
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Weiss auf weißem Hintergrund sieht man schlecht. Du musst einfach nur croppen, also den Ausschnitt des numpy arrays auswählen.
Benutzeravatar
__blackjack__
User
Beiträge: 13143
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@G-Rizzle: Schau Dir mal die Optionen `bbox_inches` und `pad_inches` von `savefig()` an.
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

🤦‍♂️ Da war ich natürlich ziemlich daneben.
G-Rizzle
User
Beiträge: 90
Registriert: Donnerstag 18. Februar 2021, 12:26

Danke euch beiden mal wieder!
es musste eine Mischung aus beidem werden. Denn selbst mit bbox_inches = 'tight' und 'pad_inches' = 0 bleibt ein kleiner weißer Rand.
Dieses Diagramm speichere ich dann, öffne es darauf in cv2, wähle in pixeln das gewünschte Feld und speichere das entstandene cropped_pic erneut.

Außerdem ist zu sagen, dass man die dpi explizit hochstellen muss, da das Bild ansonsten über savefig() in minderwertiger Qualität gespeichert wird.
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@G-Rizzle,

must du denn den Umweg über den Scatter-Plot gehen? Man kann die Daten doch sicher auch direkt in ein Bildformat schreiben.
G-Rizzle
User
Beiträge: 90
Registriert: Donnerstag 18. Februar 2021, 12:26

rogerb hat geschrieben: Sonntag 16. Januar 2022, 14:52 @G-Rizzle,

must du denn den Umweg über den Scatter-Plot gehen? Man kann die Daten doch sicher auch direkt in ein Bildformat schreiben.
ja? wie?
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

Du hast x-Koordinaten, y-Koordinaten und zu jedem Koordinatenpaar einen Heatmap-Wert.
Das muss in ein 2d numpy array umgewandelt werden, welches dann als Bild gespeichert wird.

x[0] und y[0] sind ein Koordinatenpaar, x[1] und y[1] das nächste, ...
c[0] ist der Intensitätswert an der Koordinate (x[0], y[0])
Dabei müssen die x-Koordinaten und y-Koordinaten eventuell gerundet werden, da Pixel-Koordinaten aus ganzen Zahlen bestehen.

Ich weiß nicht wie deine Daten vorliegen, aber mit ein bisschen Glück must du c nur über "reshape" von einem eindimensionalen array in zweidimensionales umwandeln.
Antworten