[matlab] PB laplacien Canny

PB laplacien Canny [matlab] - Divers - Programmation

Marsh Posté le 02-05-2012 à 19:37:15    

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 :
  1. close all
  2. clear
  3. %%%recuperation de l'image
  4. I=imread('image/lena.jpg');   
  5. I=rgb2gray(I);
  6. I=double(I)/255.0;
  7. figure,imshow(I,'notruesize'),title('image originale');
  8. figure,imshow(edge(I,'canny')),title('image contour matlab');
  9. %%%%%%%%%%%%%%%%%%% filtre de Canny%%%%%%%%%%%%%%%%%%%%%
  10. % creation du filtre
  11. n=3; %taille du filtre pour le calcul du gradient n=2*tailleFenetre +1
  12. n1=5; % taille du filtre pour le laplacien du gradient
  13. tailleFenetre=(n-1)/2;
  14. tailleFenetre1=(n1-1)/2;
  15. sigma2=(n/(2*3))^2; % Nota bene : rayon=3*sigma (gaussienne)
  16. %% calul du gradient
  17. h_canny=zeros(n,n); % filtre horizontal pour le grandient en x
  18. for i1=-tailleFenetre:tailleFenetre
  19. for j1=-tailleFenetre:tailleFenetre
  20.    h_canny(tailleFenetre+i1 +1,tailleFenetre+j1+1)=(-i1/sigma2)*exp(-(i1*i1 +j1*j1)/2*sigma2);
  21. end
  22. end
  23. v_canny=zeros(n,n);% filtre vertical pour le gradient en y
  24. for i1=-tailleFenetre:tailleFenetre
  25. for j1=-tailleFenetre:tailleFenetre
  26.    v_canny(tailleFenetre+i1 +1,tailleFenetre+j1+1)=(-j1/sigma2)*exp(-(i1*i1 +j1*j1)/2*sigma2);
  27. end
  28. end
  29. %% laplacien (derivee seconde)
  30. sigma2=(n1/(2*3))^2; % Nota bene : rayon=3*sigma
  31. sigma4=sigma2*sigma2;
  32. h2_canny=zeros(n1,n1); %filtre horizontal pour le laplacien en x
  33. for i1=-tailleFenetre1:tailleFenetre1
  34. for j1=-tailleFenetre1:tailleFenetre1
  35.    h2_canny(tailleFenetre1+i1 +1,tailleFenetre1+j1+1)=((i1*i1 - sigma2)/sigma4)*exp(-(i1*i1+j1*j1)/2*sigma2);
  36. end
  37. end
  38. v2_canny=zeros(n1,n1); %filtre vertical pour le laplacien en y
  39. for i1=-tailleFenetre1:tailleFenetre1
  40. for j1=-tailleFenetre1:tailleFenetre1
  41.    v2_canny(tailleFenetre1+i1 +1,tailleFenetre1+j1+1)=((j1*j1 - sigma2)/sigma4)*exp(-(i1*i1+j1*j1)/2*sigma2);
  42. end
  43. end
  44. v2_canny(tailleFenetre1+1,tailleFenetre1+1)=0 % modification de l'element central pour que la somme des termes de la matrice soit nulle
  45. v2_canny(tailleFenetre1+1,tailleFenetre1+1)=-sum(sum((v2_canny)));
  46. h2_canny(tailleFenetre1+1,tailleFenetre1+1)=0
  47. h2_canny(tailleFenetre1+1,tailleFenetre1+1)=-sum(sum(h2_canny));
  48. %%%%%%%%%%%%%%%% calcul de la norme du gradient
  49. gradH=filter2(h_canny,I);
  50. gradV=filter2(v_canny,I);
  51. grad=sqrt(gradH.*gradH + gradV.*gradV);
  52. %grad=abs(gradH)+abs(gradV);
  53. figure,imshow(grad,[min(min(grad)) max(max(grad))],'notruesize'),title('norme gradien');
  54. %%%%%%%%%%%%%%%%%%%%%%%%%%%% calcul du laplacien %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  55. IlaplacienH=filter2(h2_canny,I);
  56. IlaplacienV=filter2(v2_canny,I);
  57. Ilaplacien=IlaplacienH+IlaplacienV ;
  58. figure,imshow(abs(Ilaplacien),[min(min(abs(Ilaplacien))) max(max(abs(Ilaplacien)))],'notruesize');
  59. contourLaplacien=(abs(Ilaplacien)<0.2);
  60. figure,imshow(contourLaplacien);

Reply

Marsh Posté le 02-05-2012 à 19:37:15   

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed