Hallo,
ich habe ein Feld von xyz-Koordinaten. Insbesondere interessieren mich nun neben den absoluten Z-Werten die Gradienten.
Gibt es eine elegante Lösung, um diese in Python zu berechnen / darzustellen?
Gradienten aus xyz-Feld darstellen
Mir liegt eine .txt Datei nach folgendem Beispiel vor:
--------/------0,001 - 0,002 - 0,003 - 0,004
0,001---------1-------3--------5---------3
0,002---------2-------2--------2---------1
0,003---------7------8--------6---------2
0,004---------2-------1--------9---------7
die erste Spalte sind y-Werte, die erste Zeile x-Werte einer 1mm^2 großen Fläche.
Die Matrix sind gemessene Höhenwerte in z-Richtung. Die Werte im Bsp oben sind alle fiktiv. Wie gesagt liegen mir 20 mio Punkte auf der genannten Fläche vor.
Alle Werte schreibe ich in eine Liste von Listen um mit jeweils 3 Einträgen [[x1,y1,z1], [x2,y2,z2], .....].
Damit habe ich mithilfe von matplotlib eine Heatmap erstellt, also jedem z-Wert einen "Intensitätsfaktor" als Farbe (bzw Schwarzton) zugewiesen. Je tiefer der z-Wert, desto dunkler der zugewiesene Grau- bzw. Schwarzton. Damit erzeuge ich folgendes Bild:
Kontext: Das ist eine Mikroskopaufnahme einer 3d-gedruckten Metalloberfläche.
Dementsprechend sehe ich hier nur Absolutwerte des Höhenprofils. Wichtig wäre es mir aber auch Gradienten zu sehen, und genau das ist meine Frage:
1. Gibt es eine elegante, bereits implementierte Methode für sowas?
2. Wenn nicht --> Wie berechne ich sowas? Natürlich habe ich bereits gegoogelt, da finde ich allerdings nur Infos zum Gradientenberechnen von Funktionen
--------/------0,001 - 0,002 - 0,003 - 0,004
0,001---------1-------3--------5---------3
0,002---------2-------2--------2---------1
0,003---------7------8--------6---------2
0,004---------2-------1--------9---------7
die erste Spalte sind y-Werte, die erste Zeile x-Werte einer 1mm^2 großen Fläche.
Die Matrix sind gemessene Höhenwerte in z-Richtung. Die Werte im Bsp oben sind alle fiktiv. Wie gesagt liegen mir 20 mio Punkte auf der genannten Fläche vor.
Alle Werte schreibe ich in eine Liste von Listen um mit jeweils 3 Einträgen [[x1,y1,z1], [x2,y2,z2], .....].
Damit habe ich mithilfe von matplotlib eine Heatmap erstellt, also jedem z-Wert einen "Intensitätsfaktor" als Farbe (bzw Schwarzton) zugewiesen. Je tiefer der z-Wert, desto dunkler der zugewiesene Grau- bzw. Schwarzton. Damit erzeuge ich folgendes Bild:
Kontext: Das ist eine Mikroskopaufnahme einer 3d-gedruckten Metalloberfläche.
Dementsprechend sehe ich hier nur Absolutwerte des Höhenprofils. Wichtig wäre es mir aber auch Gradienten zu sehen, und genau das ist meine Frage:
1. Gibt es eine elegante, bereits implementierte Methode für sowas?
2. Wenn nicht --> Wie berechne ich sowas? Natürlich habe ich bereits gegoogelt, da finde ich allerdings nur Infos zum Gradientenberechnen von Funktionen
Der Gradient in einer Matrix um einen Punkt herum wird ueblicherweise mit einem horizontalen und einem vertikalen Sobel-Operator berechnet. Die beiden Werte sind dann der Gradient an der Stelle in x/y Richtung.
https://en.wikipedia.org/wiki/Sobel_operator
https://en.wikipedia.org/wiki/Sobel_operator
Du machst Dir also das Leben unnötig schwer, indem Du behauptest, Du hast x,y,z-Koordinaten.
In Wirklichkeit hast Du z-Werte auf einem regulären Rastern, bei dem es simpel ist, den Differenzenquotienten zu bilden.
Auch Dein Scatterplot aus dem anderen Thread ist viel zu kompliziert, weil Du eigentlich nur ein imshow benötigst, bzw. eigentlich die Matrix eins zu eins per PIL als Bild speichern könntest.
In Wirklichkeit hast Du z-Werte auf einem regulären Rastern, bei dem es simpel ist, den Differenzenquotienten zu bilden.
Auch Dein Scatterplot aus dem anderen Thread ist viel zu kompliziert, weil Du eigentlich nur ein imshow benötigst, bzw. eigentlich die Matrix eins zu eins per PIL als Bild speichern könntest.
Genau das ist meine Hoffnung / Vermutung; Sobel sieht super aus, finde ich auf den ersten Blick allerdings etwas kompliziert. Habe mal für die erste Spalte und die erste Zeile der Bsp-Matrix oben die Gradienten über die Differenzenquotienten gebildet, soweit ich ihn so verstanden habe. Stimmt das so?