Table des matières Mathematica

Transformée de Hough

1. Transformée de Hough standard

1.a. Principe

La transformée de Hough est une méthode permettant de détecter des droites dans une image, c'est-à-dire un ensemble de points plus ou moins alignés. Cette méthode repose sur le paramétrage d'une droite par un angle θ et une distance ρ comme définis sur la figure suivante :

figureA.svgFigure pleine page

L'équation cartésienne de la droite est :

ρ=xcosθ+ysinθ

L'algorithme de Hough utilise une matrice accumulatrice qui représente le plan (ρ,θ), de dimensions (p,q)p est le nombre de valeurs de ρ possibles et q le nombre de valeurs de θ. Pour chaque point (x,y) de l'image binaire traitée, chaque droite (ρ,θ) passant par ce point ajoute une unité dans l'élément correspondant de la matrice. À la fin de l'accumulation, les points de la matrice dont la valeur est la plus élevée correspondent à un grand nombre de points alignés sur l'image. Ces droites sont sélectionnées à partir d'un seuil ajustable.

1.b. Utilisation

Needs['CV`']
CVOpen[]

On commence par lire une image en niveaux de gris :

img=CVLoadImage['pic5.png',CVLoadImageGrayScale];
s=CVGetSize[img];
Image[CVGetImageArray[img,1,-1]]
imgA.pngimgA.pdf

Le but étant ici d'obtenir des droites représentant les bords des formes, on procède tout d'abord à une détection de bords de Canny :

img2=CVCreateImage[s,IplDepth8U,1];
CVCanny[img,img2,50.0,100.0,3];
                
Image[CVGetImageArray[img2,1,-1]]
imgB.pngimgB.pdf

On réserve un espace mémoire pour la séquence de lignes :

mem=CVCreateMemStorage[0];

La fonction CVHoughLines2 permet d'obtenir les lignes sous forme d'une séquence :

method=CVHoughStandard;
seq=CVHoughLines2[img2,mem,method,1.0,N[2*Pi/100],100,0.0,0.0];
                

Le 4ième argument (valeur 1.0) est la résolution en ρ de la matrice accumulatrice, le 5ième argument la résolution en θ. La résolution doit être choisie en fonction de l'image traitée. Dans le cas présent, une résolution fine est adaptée car les bords sont bien rectilignes. Le 5ième argument est le seuil à partir duquel les droites accumulées sont sélectionnées. Les deux derniers arguments sont ici inutilisés.

Le nombre de lignes retenues est donné par :

n=CVGetSeqSize[seq]
10

Le nombre de ligne dépend du seuil choisi. Pour obtenir un nombre de ligne prédeterminé, il faudra appliquer plusieurs fois la fonction CVHoughLines2 en faisant varier le seuil. Les droites sont obtenues par :

lines=CVGetHoughLines[seq,method]
{{19., 0.}, {9., 1.5707963705062866}, {-49., 2.2619469165802}, {241., 0.}, 
{278., 1.5707963705062866}, {236., 1.1309734582901}, {-52., 2.38761043548584}, 
{383., 0.}, {55., 2.2619469165802}, {381., 0.}}

Les droites sont données par les doublets (ρ,θ). Par exemple, la première droite de la liste est (ρ=19,θ=0).

Pour finir, on peut récupérer l'image en couleur et tracer dessus les lignes obtenues :

img3=CVLoadImage['pic5.png',CVLoadImageUnchanged];
CVDrawHoughLines[img3,seq,method,{255,0,0},1000,1];
                
Image[CVGetImageArray[img3,1,-1]]
imgC.pngimgC.pdf

2. Méthode de Hough probabiliste

La méthode de Hough probabiliste calcule seulement une fraction des points du plan accumulateur en les choisissant aléatoirement, ce qui la rend plus rapide que la méthode standard. Elle effectue de plus des calculs de longueur des lignes, ce qui permet de détecter des segments.

Voyons son application sur l'image précédente :

method=CVHoughProbabilistic;
seq=CVHoughLines2[img2,mem,method,1.0,N[2*Pi/100],80,10.0,1.0];

L'avant dernier argument (valeur 10.0) est la longueur minimale des segments retenus. Le dernier argument (valeur 5.0) est la distance maximale entre deux segments alignés pour qu'ils soient considérés comme un seul segment.

Le nombre de segments obtenus :

n=CVGetSeqSize[seq]
14

Les coordonnées des extrémités des segments sont obtenues par :

segments=CVGetHoughLines[seq,method]
{{{19., 277.}, {19., 12.}}, {{121., 36.}, {237., 132.}}, {{241., 276.}, {241., 
99.}}, {{22., 9.}, {238., 9.}}, {{79., 278.}, {239., 278.}}, {{381., 255.}, 
{381., 157.}}, {{126., 59.}, {172., 107.}}, {{383., 257.}, {383., 155.}}, 
{{72., 130.}, {128., 177.}}, {{262., 137.}, {360., 91.}}, {{242., 62.}, {328., 
22.}}, {{173., 215.}, {237., 138.}}, {{263., 153.}, {334., 153.}}, {{33., 95.}, 
{97., 17.}}}

Tracé des segments :

img3=CVLoadImage['pic5.png',CVLoadImageUnchanged];
CVDrawHoughLines[img3,seq,method,{255,0,0},1000,1];
                
Image[CVGetImageArray[img3,1,-1]]
imgD.pngimgD.pdf
CVClose[]
Creative Commons LicenseTextes et figures sont mis à disposition sous contrat Creative Commons.