Alternatives à la transformation de Hough pour détecter une structure de type grille

16

J'ai une image qui est composée de plusieurs «angles» qui forment une forme de grille:

entrez la description de l'image ici

Après quelques recherches, Hough semblait être un bon choix, car il n'était pas troublé par des ruptures de lignes. Cependant, le problème que j'ai est que mes lignes sont `` grasses '', et toute détection de bord que je lance (Canny dans ce cas), sélectionne les bords de la ligne, et non le milieu:

entrez la description de l'image ici

Cela signifie que la transformation de Hough finit par sélectionner l'un (ou les deux) des «côtés» de mes lignes de grille, et non le milieu.

entrez la description de l'image ici

Étant donné que je sais ce que je recherche (cette forme de grille, toujours dans à peu près la même orientation), y a-t-il une meilleure façon d'effectuer la partie `` détection de bord '' pour me donner les lignes centrales, ou devrais-je regarder à une méthode totalement différente?

Benjol
la source
Pour le contexte, cette grille sera comparée à une grille nominale pour effectuer l'étalonnage de la caméra Tsai.
Benjol
"La détection des bords que je lance, sélectionne les bords de la ligne" Oui, car la détection des bords convertit les bords en arêtes, et votre image est déjà des arêtes. Un bord est une frontière entre la lumière et l'obscurité.
endolith

Réponses:

10

La transformation de Hough aiderait en effet à récupérer la grille dans ce cas. Pour "affiner" les lignes, vous voudrez peut-être envisager le fonctionnement de la squelettisation

Cela produirait une image comme celle-ci: Sortie de squelettisation

En raison de la façon dont fonctionne la squelettisation, elle produira toujours des lignes qui sembleront non pertinentes pour la grille mais ces lignes vers des directions "erronées" ne sont pas si nombreuses (au moins dans l'image donnée) pour confondre la détection de ligne de la transformation de Hough trop et il choisira clairement les deux principaux ensembles de lignes dans des directions distinctes. (Voici à quoi ressemble la sortie HT:) entrez la description de l'image ici

Si vous utilisez MATLAB, vous pouvez consulter cette page d'aide

A_A
la source
Merci! Cela aide beaucoup. Je n'ai pas encore ma licence MATLAB, mais je l'ai essayée en utilisant SimpleSkeletonization d'AForge, et cela fonctionne mieux ... Bien que toujours pas parfait. Je reviendrai sur ce sujet plus tard lorsque j'obtiendrai de vraies données pour le tester.
Benjol
Vous voudrez peut-être essayer de seuiller votre image originale d'abord à un certain seuil qui semble produire des lignes de grille "optimales". Ce que je veux dire par optimal, c'est qu'ils sont au moins connectés. Cela pourrait améliorer les performances de la squelettisation mais vous auriez un paramètre supplémentaire à déterminer (le seuil). Peut-être que cela vaut également la peine d'améliorer également l'acquisition d'images.
A_A
oui, comme je l'ai dit, quand j'ai les vraies données avec lesquelles jouer, ça vaudra mon temps de peaufiner le système. Un doute majeur que j'ai à propos de Hough en général est que la discrétisation du thêta va travailler contre la précision de sous-pixel dont nous avons besoin. (Cela, et je ne suis pas complètement convaincu que les aberrations de l'objectif ne signifieront pas que les lignes pourraient être courbes, pas droites ...)
Benjol
11

Une alternative à la transformation de Hough serait la transformation du radon ( 1 , 2 ). Une description approximative d'un algorithme pour détecter une structure de type grille pourrait ressembler à ceci:

1. Perform Radon Transform from 0 to 180 degrees.
2. Find the two highest maxima in the angle bins.
3. For the two angles with maximal amplitude find the local maxima within the bin.
4. You can use the constraint that the maxima should have even spacing to deal with outliers.

MODIFIER :

Voici un petit extrait de matlab pour illustrer l'étape 1-3:

im = imread('grid.png');
[R, xp] = radon(im, 0:180);
imagesc(0:180, xp, R)

Résultat de la transformation du radon

plot(max(R)) % the two maxima are at 65 & 117 degrees

Maxima sous tous les angles

plot(R(:, 65))

Maxima à 65 degrés

plot(R(:,117))

Maxima à 117 degrés

Pour répondre à votre question à partir des commentaires: Il me semble, d'après le seul exemple d'image que vous avez fourni, que cette méthode est plus robuste contre les petits défauts dans la grille détectée. Les squelettes donneront rarement des lignes droites, ce qui pourrait être un inconvénient pour la transformation de Hough suivante.

bjoernz
la source
Merci, pourriez-vous me dire en quelques mots quel avantage vous attendez de la transformation du radon par rapport à la transformation de Hough?
Benjol
@benjol, j'ai mis à jour ma réponse.
bjoernz
Très bien, merci beaucoup. Une fois que l'informatique me donnera accès à Matlab, je l'essayerai!
Benjol