Sto cercando di utilizzare la trasformazione di Hough per il rilevamento dei bordi e vorrei utilizzare le immagini a gradiente come base.
Quello che ho fatto finora, dato l'immagine I
di dimensioni [M,N]
e le derivate parziali gx
, gy
, è calcolare l'angolo di pendenza in ciascun pixel come thetas = atan(gy(x,y) ./ gx
. Allo stesso modo, calcolo l'entità del gradiente come magnitudes = sqrt(gx.^2+gy.^2)
.
Per creare la trasformazione di Hough, utilizzo il seguente codice MATLAB:
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
La trasformazione di Hough risultante sembra plausibile (vedi http://i.stack.imgur.com/hC9mP.png ), ma quando provo ad usare i suoi massimi come parametri di bordo nell'immagine originale, i risultati sembrano più o meno casuali. Ho fatto qualcosa di sbagliato nel costruire la trasformazione di Hough?
AGGIORNAMENTO : Ho avuto un errore stupido nel mio codice: è rho
stato calcolato come x*cos(theta)+y*cos(theta)
anziché x*cos(theta)+y*sin(theta)
. Cioè, stavo usando due coseni invece di un coseno e un seno. Ho modificato il codice sopra e la nuova immagine risultante è sotto. Questo, tuttavia, non ha dato bordi migliori.
@endolith: per tracciare un bordo, dato un valore massimo nella hough
matrice a rho_idx, theta_idx
, traduco gli indici in rho,theta
valori:
theta = (theta_idx -1) / 100 * pi - pi / 2;
rho = rho_idx - max_rho;
Alla fine ho tracciato il bordo come y= (rho - x*cos(theta)) / sin(theta)
.