takout | Bonjour à tous,
Je suis entrain de tester l'algorithme de Canny pour détecter des contours dans une image. Mon souci c'est que je ne comprends pas pourquoi lorsque j'affiche l'image du laplacien mes contours n'apparaissent pas en noir et les zones uniformes en blanc. Normalement les contours sont les zéros du laplacien, je ne vois pas mon erreur pourtant mon gradient semble juste. Je n'arrive pas à obtenir les contours à l'aide du laplacien. Ai-je fais une erreur de programmation.
Pouvez vous m'aidez svp ?
Code :
- close all
- clear
- %%%recuperation de l'image
- I=imread('image/lena.jpg');
- I=rgb2gray(I);
- I=double(I)/255.0;
- figure,imshow(I,'notruesize'),title('image originale');
- figure,imshow(edge(I,'canny')),title('image contour matlab');
- %%%%%%%%%%%%%%%%%%% filtre de Canny%%%%%%%%%%%%%%%%%%%%%
- % creation du filtre
- n=3; %taille du filtre pour le calcul du gradient n=2*tailleFenetre +1
- n1=5; % taille du filtre pour le laplacien du gradient
- tailleFenetre=(n-1)/2;
- tailleFenetre1=(n1-1)/2;
- sigma2=(n/(2*3))^2; % Nota bene : rayon=3*sigma (gaussienne)
- %% calul du gradient
- h_canny=zeros(n,n); % filtre horizontal pour le grandient en x
- for i1=-tailleFenetre:tailleFenetre
- for j1=-tailleFenetre:tailleFenetre
- h_canny(tailleFenetre+i1 +1,tailleFenetre+j1+1)=(-i1/sigma2)*exp(-(i1*i1 +j1*j1)/2*sigma2);
- end
- end
- v_canny=zeros(n,n);% filtre vertical pour le gradient en y
- for i1=-tailleFenetre:tailleFenetre
- for j1=-tailleFenetre:tailleFenetre
- v_canny(tailleFenetre+i1 +1,tailleFenetre+j1+1)=(-j1/sigma2)*exp(-(i1*i1 +j1*j1)/2*sigma2);
- end
- end
- %% laplacien (derivee seconde)
- sigma2=(n1/(2*3))^2; % Nota bene : rayon=3*sigma
- sigma4=sigma2*sigma2;
- h2_canny=zeros(n1,n1); %filtre horizontal pour le laplacien en x
- for i1=-tailleFenetre1:tailleFenetre1
- for j1=-tailleFenetre1:tailleFenetre1
- h2_canny(tailleFenetre1+i1 +1,tailleFenetre1+j1+1)=((i1*i1 - sigma2)/sigma4)*exp(-(i1*i1+j1*j1)/2*sigma2);
- end
- end
- v2_canny=zeros(n1,n1); %filtre vertical pour le laplacien en y
- for i1=-tailleFenetre1:tailleFenetre1
- for j1=-tailleFenetre1:tailleFenetre1
- v2_canny(tailleFenetre1+i1 +1,tailleFenetre1+j1+1)=((j1*j1 - sigma2)/sigma4)*exp(-(i1*i1+j1*j1)/2*sigma2);
- end
- end
- v2_canny(tailleFenetre1+1,tailleFenetre1+1)=0 % modification de l'element central pour que la somme des termes de la matrice soit nulle
- v2_canny(tailleFenetre1+1,tailleFenetre1+1)=-sum(sum((v2_canny)));
- h2_canny(tailleFenetre1+1,tailleFenetre1+1)=0
- h2_canny(tailleFenetre1+1,tailleFenetre1+1)=-sum(sum(h2_canny));
- %%%%%%%%%%%%%%%% calcul de la norme du gradient
- gradH=filter2(h_canny,I);
- gradV=filter2(v_canny,I);
- grad=sqrt(gradH.*gradH + gradV.*gradV);
- %grad=abs(gradH)+abs(gradV);
- figure,imshow(grad,[min(min(grad)) max(max(grad))],'notruesize'),title('norme gradien');
- %%%%%%%%%%%%%%%%%%%%%%%%%%%% calcul du laplacien %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- IlaplacienH=filter2(h2_canny,I);
- IlaplacienV=filter2(v2_canny,I);
- Ilaplacien=IlaplacienH+IlaplacienV ;
- figure,imshow(abs(Ilaplacien),[min(min(abs(Ilaplacien))) max(max(abs(Ilaplacien)))],'notruesize');
- contourLaplacien=(abs(Ilaplacien)<0.2);
- figure,imshow(contourLaplacien);
|
|