Détection de contours par Laplacien
Un billet suite à la question d'une étudiante au sujet du TP de traitement d'image.
Dans la partie Opérateurs laplacien et FFT, on demande d'approximer le filtre Laplacien par une couronne dans le domaine fréquentiel. Sa question est la suivante :
Je ne comprends plus trop le rapport avec le laplacien [...] Autre petit problème, les rayons de la couronne sont très difficiles à trouver et varient suivant les images...
C'est une bonne question ! Premièrement :
Quel rapport entre la couronne et le Laplacien ?
Le Laplacien est un opérateur qui est particulièrement sensible au bruit, par conséquent avant d'appliquer le filtre laplacien à l'image
on commence par lisser cette dernière par un filtre gaussien
Les opérateurs linéaires tels que commutent avec la convolution d'où
Le filtre est communément appelé filtre LoG (Laplacian of Gaussian). Un rapide calcul donne :
En posant la distance radiale, on a
Notons
Par conséquent on a
d'où
Or la transformée d'une gaussienne est une gaussienne donc
Ainsi
Voilà pour les fonctions radiales à une dimension, revenons à la 2D et calculons
Traçons maintenant ,
puis et
On constate effectivement que dans le domaine fréquentiel le LoG est non nul sur une "couronne" (en bleu sur la figure en haut à droite) ! 🙂
Comment déterminer les rayons de la couronne ?
Essayez à partir de la formule de (en radial) de relier
et
à
(le paramètre de lissage) !
Enfin quelques remarques pour terminer :
- Le LoG (en 3D représenté en bas à gauche) est un cas particulier de "Mexican hat" (chapeau mexicain de par sa forme), qui est un filtre passe-bande très utilisé dans la décomposition en ondelettes.
- Le LoG est la limite d'une DoG (Difference of Gaussian), plus précisément :
- On peut montrer que
est une bonne approximation de
lorsque
Annexe : code Matlab des figures
N = 400; sigma = 2; h2=figure; r = linspace(-10,10,N); h = (1-r.^2./(2*sigma^2)).*exp(-r.^2./(2*sigma^2))./(pi*sigma^4); subplot(2,1,1); plot(r,h); title('Fonction radiale h(r)') r = linspace(-1,1,N); hf = -(4.*pi^2.*sigma^2.*r.^2+1).*exp(-2.*pi^2.*r.^2)./(sqrt(2.*pi).*sigma^3); subplot(2,1,2); plot(r,hf,'r'); title('TF[h](u)') set(gcf, 'color', [1 1 1]) export_fig(h2,'LoG_2D.jpg'); h1=figure; [x,y] = meshgrid(linspace(-4*sigma,4*sigma,N)); r = x.^2+y.^2; z = (1-r./(2*sigma^2)).*exp(-r./(2*sigma^2))./(pi*sigma^4); subplot(2,2,1); imagesc(z) title('LoG en 2D'); subplot(2,2,3); surfc(z), shading flat title('LoG en 3D'); [x,y] = meshgrid(linspace(-0.5,0.5,N)); r = x.^2+y.^2; z = -4*pi^2.*r.*exp(-2*pi^2*sigma^2.*r); subplot(2,2,2); imagesc(z) title('TF du LoG en 2D'); subplot(2,2,4); surfc(z), shading flat title('TF du LoG en 3D'); set(gcf, 'color', [1 1 1]) export_fig(h1,'LoG_3D.jpg');