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)
.
la source
Réponses:
Je suis un peu confus par votre question. La transformation de Hough est utilisée pour détecter les lignes, pas les bords.
Si tout ce que vous voulez, c'est une carte de bord, vous devez simplement définir un seuil d'amplitude du gradient, ou utiliser quelque chose de plus sophistiqué comme le détecteur de bord Canny.
Si vous souhaitez détecter des lignes droites, vous feriez mieux de commencer par une carte de contour, puis d'utiliser la
hough
fonction si la boîte à outils Traitement d'image, si vous y avez accès. Le problème avec une transformation de Hough sur le gradient est que les pixels de bord formant une ligne droite peuvent avoir des orientations de gradient opposées. Par exemple, considérons un motif en damier. Un bord entre deux rangées de carrés inverse l'orientation selon que vous avez un carré noir au-dessus et un carré blanc en dessous, ou l'inverse.En ce qui concerne votre implémentation, je pense que le problème est que les bacs de votre matrice Hough sont trop petits. Essentiellement, la taille du bac dans la dimension rho est 1 et la taille du bac dans la dimension thêta est inférieure à 2 degrés. Cela signifie que les orientations du gradient doivent s'allumer très précisément pour former une ligne, ce qui arrive rarement en pratique. Si vous calculez rho_idx et theta_idx de sorte que les cases soient plus grandes, cela rendra votre détecteur de ligne plus tolérant aux erreurs, et vous obtiendrez peut-être de meilleures lignes.
la source
Je ne sais pas si c'est un problème mais atan () ne vous donne que des angles de -90 à +90 degrés en raison de l'ambiguïté du quadrant. Pour obtenir l'angle de gradient complet (de -180 à 180), vous devez utiliser atan2 ().
la source
atan2
, mais cela n'a pas semblé résoudre les problèmes.