Sobeloperator auf Matrix anwenden

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 weiß, es ist vielleicht Offtopic, da es (noch) nicht direkt mit der Programmierung in Python zusammenhängt, sondern zunächst um eine prinzipielle mathematische Frage geht:
Mir liegt eine Matrix aus z-Koordinaten vor, die eine Fläche abbilden. Ich möchte nun die Gradienten der Einträge berechnen und plotten. Ich habe dies bereits mit Differenzenquotienten in x- und y getan und das Ergebnis sieht gut aus; Nachteil dieser Methode ist jedoch, dass eine Matrix mit anderen Dimensionen herauskommt, und die Gradienten für jeden Eintrag ja nur leicht versetzt an diesem gelten.
Daher wurde mir hier im Forum der Sobel-Operator empfohlen. Diesen habe ich exemplarisch auf eine fiktive Matrix angewandt. Kann hier wer bitte drüberschauen, ob das so korrekt ist?


Bild

Die erste auf der Abbildung zu sehende Matrix ist die Ausgangsmatrix. Die erste Zeile und Spalte stellen die Rasterkoordinaten in x und y dar (also an welchen Stellen in x- und y die inneren Matrixeinträge gemessen wurden) dar und sind nicht weiter zu beachten. Die roten Zahlen sind die z-Koordinaten, zu denen es Gradienten zu berechnen gilt.
Die Berechnung von Gx und Gy, bzw Gges habe ich drunter angefügt .
Die Gradientenmatrix belege ich an erste bzw. letzte Zeile und Spalte mit 0 (Randproblem); den ersten berechneten Eintrag habe ich an den in meinen Augen richtigen Stelle eingetragen

Stimmt das so? Gibt es verbesserungswürdiges?


Besten Dank für eure Hilfe!!!
tonikae
User
Beiträge: 90
Registriert: Sonntag 23. Februar 2020, 10:27

Ich weiss zwar nicht was du da genau machen willst,
aber deine Gx-Matrix scheint nicht richtig.
Die Matrix für den "right sobel" sieht eigentlich so aus:
-1 0 1
-2 0 2
-1 0 1

Du hast da in der linken unteren Ecke aber ein -2

Für weitere Kernel-Matrizen ...guckst du hier:

https://setosa.io/ev/image-kernels/
G-Rizzle
User
Beiträge: 90
Registriert: Donnerstag 18. Februar 2021, 12:26

tonikae hat geschrieben: Donnerstag 3. Februar 2022, 12:22 Ich weiss zwar nicht was du da genau machen willst,
aber deine Gx-Matrix scheint nicht richtig.
Die Matrix für den "right sobel" sieht eigentlich so aus:
-1 0 1
-2 0 2
-1 0 1

Du hast da in der linken unteren Ecke aber ein -2

Für weitere Kernel-Matrizen ...guckst du hier:

https://setosa.io/ev/image-kernels/

okay, ich habe keine ahnung was mir da passiert ist. du hast natürlich recht. auch passen in meinem Gx teilweise die Vorzeichen nicht.

Trotzdem: Ist mein Vorgehen prinzipiell so richtig?
G-Rizzle
User
Beiträge: 90
Registriert: Donnerstag 18. Februar 2021, 12:26

tonikae hat geschrieben: Donnerstag 3. Februar 2022, 12:22 Ich weiss zwar nicht was du da genau machen willst,
aber deine Gx-Matrix scheint nicht richtig.
Die Matrix für den "right sobel" sieht eigentlich so aus:
-1 0 1
-2 0 2
-1 0 1

Du hast da in der linken unteren Ecke aber ein -2

Für weitere Kernel-Matrizen ...guckst du hier:

https://setosa.io/ev/image-kernels/


wobei: wenn ich den wikipedia-artikel lese
https://de.wikipedia.org/wiki/Sobel-Operator

sieht Gx so aus:
1 0 -1
2 0 -2
1 0 -1


Gy
1 2 1
0 0 0
-1 -2 -1
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Na es gibt left/right und top/bottom-Sobel. Die unterscheiden sich nur durch die Vorzeichen. Sieht man auch gut in dem schicken Link von tonikae.
G-Rizzle
User
Beiträge: 90
Registriert: Donnerstag 18. Februar 2021, 12:26

okay, vielen dank; sieht wirklich mächtig aus und ist interessant zum rumspielen;

trotzdem: das "intelligenteste" / mathematisch beste wäre sobel-left + right bzw top/bottom zu überlagern oder? wie es im Wikipedia-Artikel gemacht wird?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn du gradienten willst, mE nicht. Die sind ja nun orientiert, und dazu müssen sie 2 Dimensionen haben. Aber das musst du wissen.
G-Rizzle
User
Beiträge: 90
Registriert: Donnerstag 18. Februar 2021, 12:26

__deets__ hat geschrieben: Donnerstag 3. Februar 2022, 13:46 Die sind ja nun orientiert, und dazu müssen sie 2 Dimensionen haben.
was meinst du damit?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Na ein gradient geht auf einer 2-dimensionalen Fläche doch in eine Richtung. Ist das irrelevant für dich? Kann ja sein.
G-Rizzle
User
Beiträge: 90
Registriert: Donnerstag 18. Februar 2021, 12:26

ich...weiß nicht? :D was würdest du sagen?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich habe doch dein Problem nicht. Wenn du nicht weißt, was du willst, wer sonst soll es denn wissen? Wozu ist der gradient denn notwendig?
G-Rizzle
User
Beiträge: 90
Registriert: Donnerstag 18. Februar 2021, 12:26

okay, sorry. Recht hast du.

Also, ich untersuche Metalloberflächen auf Defekte, beispielsweise Löcher, Spritzer oder Kugelförmige Ausbildungen, die beim Schaffungsprozess entstanden sind; an diesen finden sich lokal starke Steigungen (eben an den Löchern oder den Erhebungen); diese interessieren mich (beispielsweise ob bestimmte Defekte bestimmte Gradienten aufweisen etc). Nutzt dir die Info etwas?

Mithilfe der Gradienten würde ich dann gerne eine Heatmap zum jeweiligen Bauteil erstellen und diese einer Objekt-Erkennungs KI übergeben (YOLOv4).

Das ganze habe ich ja bereits mit Differenzenquotienten gemacht und das funktioniert gut & sieht gut aus, nur meint mein Betreuer, dass meine Bildung der Differenzenquotienten unsauber ist und Sobel sauberer wäre
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Na dann kommt es eben drauf an, wie die KI die Daten haben will. Wenn die einfach nur mit Schwellwerten arbeitet, und nicht mit 2D-Daten, dann kannst du das schon kombinieren zu einem Steigungswert. Wobei ich dann die Frage stellen wuerde, warum du nicht gleich zB sowas wie canny edge drueberlaufen laesst, dass kombiniert diverse Verfahren (Sobel inklusive) zu gut abgrenzbaren Features.
Antworten