Forum: Digitale Signalverarbeitung / DSP / Machine Learning Approximation der partiellen Ableitung bei Pixeln


von Peter (Gast)


Lesenswert?

Hallo,

bei einigen Kanten- und Eckendetektoren für Grauwert-Bilder braucht man 
die Approximation der 1. oder 2. partiellen Ableitungen (woraus Gradient 
und Hesse-Matrix folgen) für bestimmte Pixel.

Soweit ich es richtig verstanden habe, wird die erste partielle 
Ableitung durch die Differenz (der Grauwerte) zu den benachbarten Pixeln 
berechnet.
Und was sind dann die zweiten partiellen Ableitungen?

Es wäre toll, wenn mir jemand für folgendes Beispiel die Approximationen 
der ersten und zweiten partiellen Ableitung mit Rechenweg und Erklärung 
berechnen könnte (damit ich eine Vorstellung bekomme) :

10 14 15 11 09
08 13 16 23 08
08 12 39 22 10
07 11 29 17 12
04 10 34 22 09

Es geht um das mittlere Pixel mit dem Grauwert 39.

Wenn ich richtig liege, dann wäre die erste partielle Ableitung nach x :
(39 - 12, 39 - 39, 39 - 22) = (27, 0, 17)

und nach y :
(39 - 16, 39 - 39, 39 - 29) = (23, 0, 10)

Danke im Vorraus,
der Peter

von Falk S. (db8fs)


Lesenswert?

Schau dir mal den Sobel-Operator (1. Ableitung) und den Laplace-Operator 
an (2.Ableitung).

Ersterer hat eigentlich die Filtermaske (vertikale Kanten)
1
 [ -1 0 1 ]
2
 [ -2 0 2 ]
3
 [ -1 0 1 ]

wobei also auch die Zeilen über und unter des aktuellen Pixels zu einen 
gewichteten Mittelwert zusammengefasst werden. Die '2' soll nur die 
aktuelle Zeile stärker wichten.
1-dimensional nur auf die Zeile deines Zentralpixels '39' bezogen, 
multiplizierst du also die Vektoren der Faltungsmaske mit deinem 
Datenvektor zusammen: [-1 0 1]*[12 39 22]' = 10

Der Laplace-Operator ist eigentlich überall definiert als
1
∇²f = ∂²f/∂²x² + ∂²f/∂²y²

Die partielle Ableitung nach x ist also diskret ∂²f/∂²x² = f(x+1, y) + 
f(x-1,y) - 2*f(x,y), in y-Richtung ∂²f/∂²y² = f(x,y-1) + f(x,y+1) - 
2*f(x,y).

Addierst du beides zusammen, kriegst du die Filtermaske in 2D:
1
[ 0  1  0 ]
2
[ 1 -4  1 ]
3
[ 0  1  0 ]

Die Maske legst du mit dem Element -4 in der Mitte über deine 39. Dann 
multiplizierst du jedes Element der Filtermaske mit dem Pixel, über dem 
das Element liegt und addierst das zusammen. Hier ist also 12 + 16 + 22 
+ 29 - 4*39 dein gefilterter Wert. Siehe Faltung.

: Bearbeitet durch User
von Sigi (Gast)


Lesenswert?

Peter schrieb:
> Es wäre toll, wenn mir jemand für folgendes Beispiel die Approximationen
> der ersten und zweiten partiellen Ableitung mit Rechenweg und Erklärung
> berechnen könnte (damit ich eine Vorstellung bekomme) :

Im eindim. Fall lässt es sich sehr leicht hinschreiben,
z.B. für eine Funktion f(x) ist

d_f / d_x ~= [f(x+delta)-f(x-delta)] / [2*delta]

oder auch einseitig

d_f / d_x ~= [f(x+delta)-f(x)] / delta

und

d^2_f / (d_x)^2 ~= [f(x+delta)-2*f(x)+f(x-delta) / delta^2

Das dann auf einen Filter zu übertragen sollte
wohl einfach sein.

von Falk S. (db8fs)


Lesenswert?

Sigi schrieb:
> d^2_f / (d_x)^2 ~= [f(x+delta)-2*f(x)+f(x-delta) / delta^2

Genau, so wird das nur unter Anwendung der Definition für die Ableitung 
hergeleitet. Und die Funktionswerte der 2-dimensionalen Funktion f:ℕ×ℕ↦ℕ 
für ein (x,y)∈ ℕ×ℕ entspricht jeweils einem Pixel. Mehr ist da nicht 
dahinter. Literatur: z.B. Gonzales/Woods oder halt Netz: Faltung

von Peter (Gast)


Lesenswert?

Vielen Dank für die Antworten. Hat mir sehr geholfen! Soweit verstanden.

Da ich auch die Hesse-Matrix des Pixels brauche, fehlt mir noch die 
Ableitung nach x und y, also
Wie bestimme ich die für ein Pixel?

von Falk S. (db8fs)


Lesenswert?

Eigentlich müsstest Du das jetzt selber auflösen können, wenn Du das 
Prinzip verstanden hast. Sigi hat Dir die Definition der Ableitungsregel 
gegeben und gemäß https://de.wikipedia.org/wiki/Partielle_Ableitung 
kannst du machen:

Müsstest also nur nach deiner erste Ableitung nach y nochmal nach x 
ableiten.

: Bearbeitet durch User
von Peter (Gast)


Lesenswert?

Also dann :

?

von Sigi (Gast)


Lesenswert?

Ja, du kannst aber noch folgende Erweiterung
vornehmen: Sollten deine Pixel nicht quadratisch
sein, dann ändert sich die Ableitung bei
Rotation. Führe also für X- und Y-Ableitung
verschiedene Deltas ein, die an die Pixelmasse
angepasst sind (=> Rotationsinvarianz der
Ableitung).

von Peter (Gast)


Lesenswert?

Also genau die gleiche Formel, nur mit einem jeweils verschiedenen Delta 
für die x und die y-Richtung (z.B. dann DeltaX und DeltaY)?

Im meinem Anwendungsfall rechne ich mit der 8er bzw. 26er-Nachbarschaft 
von Bildern. Da sollten die Pixel doch quadratisch sein Delta in beide 
Richtungen gleich 1, oder?

von Falk S. (db8fs)


Lesenswert?

Lass bitte die Multiplikations-Punkte zwischen den partiellen 
Ableitungsoperatoren weg - ist zwar klar, was gemeint ist, aber eben der 
Notation wegen.

Nun setzt du jetzt noch δ=1, kriegst also ∂²f/∂x∂y = (f(x-1,y-1) + 
f(x-1,y+1) - f(x+1,y-1) + f(x+1,y+1) ) / 4.

und stellst Dir daraus die Filtermaske auf:
1
[ 0.25 0 0.25 ]
2
[  0   0   0  ]
3
[ 0.25 0 0.25 ]

von Falk S. (db8fs)


Lesenswert?

Sigi schrieb:
> Ja, du kannst aber noch folgende Erweiterung
> vornehmen: Sollten deine Pixel nicht quadratisch
> sein, dann ändert sich die Ableitung bei
> Rotation.

Jo, guter Hinweis. Für's allgemeine Verständnis wird die Annahme δ=1 
aber in beiden Richtungen sicher erstmal reichen.

von Peter (Gast)


Lesenswert?

Ok. Vielen Dank für eure Hilfe.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.