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)
.