Algorithmique et Imagerie
Détection de contours : les opérateurs de Canny-Deriche
Dans son article [2], R. Deriche propose
un schéma général d'algorithme récursif,
qui permet moyennant un simple changement de
paramètres d'obtenir des filtres lisseurs,
dérivateurs et dérivateurs d'ordre 2.
La forme générale du filtre de Deriche est la suivante :
f : le signal à filtrer (de support [0...M-1]×[0...N-1])
g : le signal résultat
g-, g+, r : résultats intermediaires
p : paramètre du filtre (également noté alpha)
a1...8, b1...4 :
paramètres calculés à partir de a,
différents selon les applications
g-[m,n] = a1 f[m,n] + a2 f[m,n-1] + b1 g-[m,n-1] + b2 g-[m,n-2] |
|
f[m,-1] = 0 ; g-[m,-2] = g-[m,-1] = 0 |
|
g+[m,n] = a3 f[m,n+1] + a4 f[m,n+2] + b1 g+[m,n+1] + b2 g+[m,n+2] |
|
f[m,N] = f[m,N+1] = 0 ; g+[m,N] = g+[m,N+1] = 0 |
|
r[m,n] = g-[m,n] + g+[m,n] |
|
g-[m,n] = a5 r[m,n] + a6 r[m-1,n] + b3 g-[m-1,n] + b4 g-[m-2,n] |
|
r[-1,n] = 0 ; g-[-2,n] = g-[-1,n] = 0 |
|
g+[m,n] = a7 r[m+1,n] + a8 r[m+2,n] + b3 g+[m+1,n] + b4 g+[m+2,n] |
|
r[M,n] = r[M+1,n] = 0 ; g+[M,n] = g+[M+1,n] = 0 |
|
g[m,n] = g-[m,n] + g+[m,n] |
|
On voit par exemple qu'en choisissant les valeurs de paramètres suivantes :
a1 = 1 ; a2 = a3 = a4 = b1 = b2 = 0 |
|
a5 = 0 ; a6 = k'e-p ; a7 = - k'e-p ; a8 = 0 |
|
on obtient le filtre dérivateur étudié en cours, agissant
dans la direction x.
0) Récupérez le kit de développement grâce au
lien que vous trouverez en bas de cette page. Vous y trouverez
un "squelette" d'opérateur (fichier src/lib/lderiche.c)
que vous devrez compléter. Lisez le tutoriel (tutorial.html)
qui se trouve dans le répertoire doc.
1) Etudiez la fonction "derichegen" qui implémente le filtre
général de Deriche. Vérifiez qu'elle implémente
effectivement les opérateurs récursifs étudiés en
cours.
2) Essayez sur une image le filtre dérivateur en x obtenu grâce au jeu de
coefficients ci-dessus. Attention : pour visualiser le
résultat,
il faudra normaliser
les valeurs de l'image de sortie, qui sont comprises entre -255 et 255, pour les
ramener dans l'intervalle [0...255].
3) Implémentez de la même façon un filtre dérivateur en y, puis un opérateur
calculant le module du gradient. Essayez cet opérateur sur des images.
4) On peut améliorer l'opérateur précédent en faisant agir, conjointement au
filtre dérivateur en x, un filtre lisseur en y, et réciproquement. Cela correspond
aux jeux de paramètres suivants :
k = |
(1 - e-p)2
1 + 2 pe-p - e-2p
|
; k' = |
(1 - e-p)2
e-p
|
|
|
a1 = k ; a2 = k e-p (p- 1) ; a3 = k e-p (p+ 1) ; a4 = - k e-2p |
|
a5 = 0 ; a6 = k'e-p ; a7 = - k'e-p ; a8 = 0 |
|
b1 = b3 = 2 e-p ; b2 = b4 = - e-2p |
|
et
a1 = 0 ; a2 = k'e-p ; a3 = - k'e-p ; a4 = 0 |
|
a5 = k ; a6 = k e-p (p- 1) ; a7 = k e-p (p+ 1) ; a8 = - k e-2p |
|
b1 = b3 = 2 e-p ; b2 = b4 = - e-2p |
|
Le module du gradient se calcule ensuite de la même façon qu'en 3. Comparez les
résultats avec ceux obtenus précédemment.
Etudiez l'impact du paramètre alpha.
5) On veut extraire les contours des objets dans une image (par exemple
"/user/coupriem/Images/2d/Divers/buro.pgm"). Pour cela, on peut seuiller
le module du gradient. Essayez de trouver, pour l'image en question,
une valeur de seuil "convenable". On pourra utiliser l'opérateur
"/user/coupriem/Pink/linux/bin/seuil".
6) John Canny a employé une méthode basée sur un double
seuillage, dite aussi seuillage par hystérésis. Cette
méthode revient à opérer la reconstruction
géodésique d'un ensemble obtenu avec seuil "haut" dans
un ensemble obtenu avec un seuil "bas". Essayez par cette méthode
d'améliorer les résultats obtenus en 5).
On pourra utiliser l'opérateur "/user/coupriem/Pink/linux/bin/reconsdilat".
Pour aller plus loin (traiter une question au choix)
7) En vous inspirant de l'opérateur de gradient, implémentez
un opérateur de Laplacien. Utilisez-le pour le réhaussement
d'images floues (par exemple "/user/coupriem/Images/2d/Bouchoucha/*.pgm").
8) En vous inspirant de l'opérateur de gradient 2D, implémentez
un opérateur de gradient 3D. Utilisez-le pour extraire les
contours d'une image IRM de cerveau (par exemple "/user/coupriem/Images/3d/Cerveau/cropmri.pgm").
References
- [1]
-
J. Canny,
``A Computational Approach to Edge Detection'', IEEE PAMI,
Vol. 8, No. 6, pp. 679-698, 1986.
- [2]
-
R. Deriche,
``Fast Algorithms for Low-Level Vision'', IEEE PAMI,
Vol. 12, No. 1, pp. 78-87, 1990.
A récupérer :
Après avoir sauvé ce fichier sur votre compte, tapez:
tar zxvf pinkdev.tgz
cd Pinkdev
make
et lisez le tutoriel (tutorial.html)
qui se trouve dans le répertoire doc.
Pour tester vos opérateurs, vous trouverez des images au format
pgm dans /user/coupriem/Images/2d .
File translated from TEX by TTH, version 1.95.
On 8 Feb 1999, 07:22.