So implementieren Sie eine gradientenbasierte Hough-Transformation

9

Ich versuche, die Hough-Transformation für die Kantenerkennung zu verwenden, und möchte Gradientenbilder als Basis verwenden.

Was ich bisher das Bild gegeben getan haben , Ivon ihrer Größe [M,N]und ihrer partiellen Ableitungen gx, gyist der Steigungswinkel in jedem Pixel zu berechnen thetas = atan(gy(x,y) ./ gx. Ebenso berechne ich die Gradientengröße als magnitudes = sqrt(gx.^2+gy.^2).

Um die Hough-Transformation zu erstellen, verwende ich den folgenden MATLAB-Code:

max_rho = ceil(sqrt(M^2 + N^2));
hough = zeros(2*max_rho, 101);
for x=1:M
    for y=1:N
        theta = thetas(x,y);
        rho = x*cos(theta) + y*sin(theta);

        rho_idx = round(rho)+max_rho;
        theta_idx = floor((theta + pi/2) / pi * 100) + 1;
        hough(rho_idx, theta_idx) = hough(rho_idx, theta_idx) + magnitudes(x,y);
    end
end

Die resultierende Hough-Transformation sieht plausibel aus (siehe http://i.stack.imgur.com/hC9mP.png ), aber wenn ich versuche, ihre Maxima als Kantenparameter im Originalbild zu verwenden, sehen die Ergebnisse mehr oder weniger zufällig aus. Habe ich beim Aufbau der Hough-Transformation etwas falsch gemacht?

UPDATE : Ich hatte einen dummen Fehler in meinem Code: rhowurde als x*cos(theta)+y*cos(theta)statt berechnet x*cos(theta)+y*sin(theta). Das heißt, ich habe zwei Cosinus anstelle eines Cosinus und eines Sinus verwendet. Ich habe den Code oben bearbeitet und das neue resultierende Bild ist unten. Dies ergab jedoch keine viel besseren Kanten.

@endolith: Zur Darstellung , die eine Kante, da ein maximaler Wert in der hough-Matrix bei rho_idx, theta_idx, I die Indizes übersetzen rho,thetaWerte:

theta = (theta_idx -1) / 100 * pi - pi / 2;
rho = rho_idx - max_rho;

Zum Schluss zeichne ich die Kante als y= (rho - x*cos(theta)) / sin(theta).

Neues Ergebnis

Jonas Due Vesterheden
quelle
"Wenn ich versuche, seine Maxima als Kantenparameter im Originalbild zu verwenden" Wie machst du das?
Endolith
@ Jonas Due Vesterheden Ich frage mich nur, ob dies ein Zeit-VS-Doppler-Frequenzbild ist? ...
Spacey
@Mohammad: Nicht das ich wüsste. Das Originalbild zeigt eine Leiterplatte. Was meinst du mit "VS"?
Jonas Due Vesterheden
@ JonasDueVesterheden 'VS' bedeutet nur 'versus'. (Zeit gegen Dopplerfrequenz ') :-)
Spacey
Sie sollten Ihre Hough-Karte glätten, bevor Sie die Non-Max-Unterdrückung anwenden.

Antworten:

2

Ihre Frage verwirrt mich ein wenig. Die Hough-Transformation wird verwendet, um Linien und keine Kanten zu erkennen.

Wenn Sie nur eine Kantenabbildung wünschen, sollten Sie einfach die Gradientengröße einschränken oder etwas ausgefalleneres wie den Canny-Kantendetektor verwenden.

Wenn Sie gerade Linien erkennen möchten, sollten Sie besser mit einer Kantenabbildung beginnen und dann die houghFunktion in der Toolbox Bildverarbeitung verwenden, wenn Sie Zugriff darauf haben. Das Problem bei der Durchführung einer Hough-Transformation des Verlaufs besteht darin, dass Kantenpixel, die eine gerade Linie bilden, möglicherweise entgegengesetzte Verlaufsorientierungen aufweisen. Betrachten Sie beispielsweise ein Schachbrettmuster. Eine Kante zwischen zwei Reihen von Quadraten kippt die Ausrichtung um, je nachdem, ob Sie oben ein schwarzes Quadrat und unten ein weißes Quadrat haben oder umgekehrt.

In Bezug auf Ihre Implementierung denke ich, dass das Problem darin besteht, dass die Fächer in Ihrer Hough-Matrix zu klein sind. Im Wesentlichen beträgt die Behältergröße in der Rho-Dimension 1 und die Behältergröße in der Theta-Dimension weniger als 2 Grad. Das bedeutet, dass die Gradientenorientierungen sehr genau leuchten müssen, um eine Linie zu bilden, was in der Praxis selten vorkommt. Wenn Sie rho_idx und theta_idx so berechnen, dass die Fächer größer sind, wird Ihr Zeilendetektor fehlertoleranter und Sie erhalten möglicherweise bessere Zeilen.

Dima
quelle
1

Ich habe keine Ahnung, ob dies ein Problem ist, aber atan () gibt Ihnen aufgrund der Quadrantenmehrdeutigkeit nur Winkel von -90 bis +90 Grad. Um den vollen Gradientenwinkel (von -180 bis 180) zu erhalten, müssen Sie atan2 () verwenden.

Hilmar
quelle
Danke für den Vorschlag! Soweit ich weiß, sollte es ausreichen, die Winkel von -90 bis +90 Grad zu verwenden, da die "Richtungen" der Kanten keine Rolle spielen. Ich habe es versucht atan2, aber es schien die Probleme nicht zu beheben.
Jonas Due Vesterheden