J'essaie d'utiliser la transformée de Hough pour la détection des bords et je voudrais utiliser des images de dégradé comme base.
Ce que j'ai fait jusqu'à présent, compte tenu de l'image I
de taille [M,N]
et de ses dérivées partielles gx
, gy
, consiste à calculer l'angle de gradient dans chaque pixel thetas = atan(gy(x,y) ./ gx
. De même, je calcule la magnitude du gradient comme magnitudes = sqrt(gx.^2+gy.^2)
.
Pour construire la transformation Hough, j'utilise le code MATLAB suivant:
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 transformation Hough résultante semble plausible (voir http://i.stack.imgur.com/hC9mP.png ), mais lorsque j'essaie d'utiliser ses maxima comme paramètres de bord dans l'image d'origine, les résultats semblent plus ou moins aléatoires. Ai-je fait quelque chose de mal en construisant la transformation de Hough?
MISE À JOUR : J'ai eu une erreur stupide dans mon code: a rho
été calculé comme x*cos(theta)+y*cos(theta)
au lieu de x*cos(theta)+y*sin(theta)
. Autrement dit, j'utilisais deux cosinus au lieu d'un cosinus et d'un sinus. J'ai édité le code ci-dessus et la nouvelle image résultante est ci-dessous. Cependant, cela n'a pas donné de meilleurs bords.
@endolith: Pour tracer une arête, étant donné une valeur maximale dans la hough
matrice à rho_idx, theta_idx
, je traduis les indices en rho,theta
valeurs:
theta = (theta_idx -1) / 100 * pi - pi / 2;
rho = rho_idx - max_rho;
Enfin, je trace le bord comme y= (rho - x*cos(theta)) / sin(theta)
.