Détection de contours par Laplacien

mathématiques
Author

Kévin Polisano

Published

April 8, 2015

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 \(\Delta=\frac{\partial^2}{\partial x^2}+\frac{\partial^2}{\partial y^2}\) à l’image \(I\) on commence par lisser cette dernière par un filtre gaussien \[G_{\sigma}(x,y)=\frac{1}{2\pi \sigma^2}e^{-\frac{(x^2+y^2)}{2\sigma^2}}\] Les opérateurs linéaires tels que \(\Delta\) commutent avec la convolution d’où \[(I\ast G_{\sigma})\ast \Delta=I\ast (G_{\sigma}\ast \Delta)=I\ast (\Delta \ast G_{\sigma})=I\ast (\Delta G_{\sigma})\]

Le filtre \(\Delta G_{\sigma}\) est communément appelé filtre LoG (Laplacian of Gaussian). Un rapide calcul donne : \[\Delta G_{\sigma}(x,y)=\frac{1}{\pi \sigma^4}\left(\frac{x^2+y^2}{2\sigma^2}-1\right)e^{-\frac{(x^2+y^2)}{2\sigma^2}}\]

En posant \(r=\sqrt{x^2+y^2}\) la distance radiale, on a \[h(r):=\Delta G_{\sigma}(r)=\frac{1}{\pi \sigma^4}\left(\frac{r^2}{2\sigma^2}-1\right)e^{-\frac{r^2}{2\sigma^2}}\]

Notons \[g(x)=\frac{1}{2\pi \sigma^2}e^{-\frac{x^2}{2\sigma^2}}\] \[g'(x)=-\frac{1}{2\pi \sigma^4}xe^{-\frac{x^2}{2\sigma^2}}\] \[(g')'(x)=\frac{1}{2\pi \sigma^4}\left(\frac{x^2}{\sigma^2}-1\right)e^{-\frac{x^2}{2\sigma^2}}\]

Par conséquent on a \[h(r)=(g')'(r)-\frac{1}{\sigma^2}g(r)\] d’où \[\hat h(u)=-4\pi^2 u^2 \hat g(u)-\frac{1}{\sigma^2} \hat g(u)\]

Or la transformée d’une gaussienne est une gaussienne donc \[\hat g(u)=\frac{1}{\sqrt{2\pi}\sigma}e^{-2\pi^2\sigma^2 u^2}\]

Ainsi \[\hat h(u)=-\frac{1}{\sqrt{2\pi}\sigma^3}(4\pi^2\sigma^2u^2+1)e^{-2\pi^2\sigma^2 u^2}\]

Voilà pour les fonctions radiales à une dimension, revenons à la 2D et calculons \[\mathcal{F}(\Delta G_{\sigma})(u,v)=-4\pi^2(u^2+v^2)\mathcal{F}(G_{\sigma})=-4\pi^2(u^2+v^2)e^{-2\pi^2 \sigma^2(u^2+v^2)}\]

Traçons maintenant \(h(r)\), \(\hat h(u)\)

puis \(\Delta G_{\sigma}(x,y)\) et \(\mathcal{F}(\Delta G_{\sigma})(u,v)\)

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 \(\mathcal{F}(\Delta G_{\sigma})(u,v)\) (en radial) de relier \(r_1\) et \(r_2\) à \(\sigma\) (le paramètre de lissage) !

Enfin quelques remarques pour terminer :

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');