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 , I
von ihrer Größe [M,N]
und ihrer partiellen Ableitungen gx
, gy
ist 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: rho
wurde 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,theta
Werte:
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)
.
quelle
Antworten:
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
hough
Funktion 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.
quelle
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.
quelle
atan2
, aber es schien die Probleme nicht zu beheben.