Comment implémenter une transformation de Hough basée sur un gradient


9

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 Ide 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 houghmatrice à rho_idx, theta_idx, je traduis les indices en rho,thetavaleurs:

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

Nouveau résultat


"lorsque j'essaie d'utiliser ses maxima comme paramètres de contour dans l'image d'origine" Comment faites-vous cela?
endolith

@Jonas Due Vesterheden Je me demande simplement si c'est une image de fréquence Doppler VS temporelle? ...
Spacey

@Mohammad: Pas que je sache. L'image originale est d'une carte de circuit imprimé. Que voulez-vous dire par «VS»?
Jonas Due Vesterheden

@JonasDueVesterheden 'VS' signifie simplement 'versus'. (Temps versus fréquence doppler ') :-)
Spacey

Vous devez lisser votre carte de Hough avant de lui appliquer la suppression Non max.

Réponses:


2

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


1

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


Merci pour la suggestion! Si je comprends bien, il devrait être suffisant d'utiliser les angles de -90 à +90 degrés, car les "directions" des bords n'ont pas d'importance. J'ai essayé d'utiliser atan2, mais cela n'a pas semblé résoudre les problèmes.
Jonas Due Vesterheden du
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.