Was ist Gradientenausrichtung und Gradientenstärke?
Zur Zeit studiere ich ein Modul in computer vision " edge detection.
Ich versuche zu verstehen, die Bedeutung der Gradienten-Orientierung und die gradient-magnitude.
InformationsquelleAutor der Frage Jack welch | 2013-11-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie erläutert durch Dima in seinem Antwortsollten Sie vertraut sein mit dem mathematischen Konzept der Farbverlaufum besser zu verstehen, die Steigung im Bereich der Bildverarbeitung.
Meine Antwort basiert auf der Antwort von mevatron dieser Frage.
Hier finden Sie eine einfache erste Bild, der eine weiße Scheibe auf schwarzem hintergrund:
können Sie berechnen eine Näherung des Gradienten des Bildes. Als Dima erklärte in seiner Antwort, haben Sie zwei Komponenten des Gradienten, eine horizontale und eine vertikale Komponente.
Den folgenden Abbildungen zeigt die horizontale Komponente:
es zeigt, wie viel die Graustufen im Bild ändern in der horizontalen Richtung (es ist die Richtung der positiven x -, scan-das Bild von Links nach rechts), diese änderung ist "codiert" in der grauen Ebene des Bildes mit der horizontalen Komponente: das mittlere graue Niveau bedeutet keine änderung, die hellen Ebenen bedeutet der Wechsel von einem dunklen Wert auf ein helles Wert, die dunklen Ebenen bedeuten einen Wechsel von einem hellen Wert auf einen dunklen Wert. Also, im Bild oben sehen Sie die heller-Wert in den linken Teil des Kreises, weil es im linken Teil des ersten Bildes, dass Sie die schwarz zu weiß übergang, gibt Sie der linken Kante der Scheibe; ähnlich, im Bild oben sehen Sie die dunkler-Wert im rechten Teil des Kreises, denn es ist im rechten Teil des ersten Bildes, dass Sie die weiß-schwarz-übergang, der Ihnen den rechten Rand der Festplatte. Im Bild oben, der innere Teil der Scheibe und hintergrund sind auf eine mittlere graue Niveau, da gibt es keine Veränderung im inneren der Scheibe und im hintergrund.
Können wir analoge Beobachtungen für die vertikale Komponente, es zeigt, wie das Bild ändern in der vertikalen Richtung, D. H. das Scannen des Bildes von oben nach unten:
Können Sie jetzt kombinieren Sie die beiden Komponenten, um die Größe des Verlaufs und der Orientierung des Gradienten.
Dem folgenden Bild ist die Größe des Gradienten:
Wieder, in der obigen Abbildung die änderung im ersten Bild ist codiert in der Grau-Ebene: hier sehen Sie, dass weiß bedeutet eine hohe änderung der ursprünglichen Bildes, während schwarz bedeutet keine Veränderung überhaupt.
Also, wenn man sich das Bild von der Größenordnung des Gradienten kann man sagen "wenn das Bild hell ist, bedeutet es eine große Veränderung in der ursprünglichen Bild, wenn es dunkel ist, es bedeutet keine änderung oder sehr llittle ändern".
Dem folgenden Bild ist die Orientierung des Gradienten:
In der obigen Abbildung die Orientierung wird wieder kodiert als Grauwerte: Sie können sich bei der Orientierung als der Winkel ein Pfeil von den dunklen Teil des Bildes, um den hellen Teil des Bildes, der Winkel bezeichnet wird, um ein xy-Bild, in dem die x läuft von Links nach rechts, während die y läuft von oben nach unten. Im Bild oben sehen Sie alle Graustufen von schwarz (null-Grad) auf das weiße (360 Grad). Wir codieren die Informationen, die mit Farbe:
in der obigen Abbildung werden die Informationen Kodieren, auf diese Weise:
rot: der Winkel ist zwischen 0 und 90 Grad
cyan: der Winkel ist zwischen 90 und 180 Grad
grün: der Winkel liegt zwischen 180 und 270-Grad -
gelb: der Winkel zwischen 270 und 360-Grad -
Hier ist es der C++ OpenCV code für die Herstellung der oben genannten Bilder.
Achten Sie auf die Tatsache, dass für die Berechnung der Orientierung, ich benutze die Funktion
cv::phase
die, wie erläutert, in der docgibt einem Winkel von 0, wenn beide die vertikale Komponente und die horizontale Komponente des Gradienten null sind; das kann praktisch sein, aber aus mathematischer Sicht schlicht und einfach falsch, denn wenn beide Komponenten gleich null sind, die Orientierung ist nicht definiert und nicht der einzig sinnvolle Wert für eine Orientierung gehalten, in einem floating-point-C++ - Typ ist einNaN
.Es ist schlichtweg falsch, weil ein 0-Grad-Orientierung, zum Beispiel, ist bereits in Bezug auf eine horizontale Kante und es kann nicht verwendet werden, die etwas anderes vertreten, wie eine region, die keine Kanten und so einer region, wo die Orientierung bedeutungslos ist.
InformationsquelleAutor der Antwort Alessandro Jacopson
Der gradient einer Funktion von zwei Variablen x, y ist ein Vektor, der die partiellen Ableitungen in x-und y-Richtung. Also wenn deine Funktion f(x,y) der gradient ist der Vektor (f_x, f_y). Ein Bild ist eine diskrete Funktion von (x,y), so kann man auch darüber reden, den Farbverlauf in einem Bild.
Dem Farbverlauf des Bildes hat zwei Komponenten: die x-Ableitung und die y-Ableitung. Also, man kann es als Vektoren (f_x, f_y) definiert, die an jedem pixel. Diese Vektoren haben eine Richtung, atan(f_y /fx) und eine Größenordnung sqrt(f_x^2 + f_y^2). So, können Sie stellen Sie den Farbverlauf eines Bildes entweder ein x-Derivat-Bild und ein y-Ableitung Bild, oder als Richtung Bild und die Größe Bild.
InformationsquelleAutor der Antwort Dima