Hysteresis thresholding dans la méthode de détection des bords de Canny
Bonjour à tous,
J'essaie d'implémenter en MATLAB une fonction qui détecte les bords d'une image à la méthode de Canny. J'ai implémenté les fonctions 'convolution avec un noyau gaussien', et 'suppression des non maxima locaux' (cette dernière supprime les non maxima locaux après avoir fait un seuillage sur les normes des pixels). Je les appelle conv_gauss et nms.
Il ne me reste que la fonction 'hysteresis thresholding' que j'appelle hyst_tresh et qui retourne le résultat final
Voici le code que j'écris :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| function output=hyst_thresh(I,t1,t2) %on suppose t1>t2
I_blur=conv_gauss(I); %la variance est fixée dans le corps de conv_gauss
I_nms_1=nms(I,t1); %I_nms_1 ne contient que les maxima locaux supérieur à t1.
I_nms_2=nms(I,t2); %le seuillage est inclus dans nms
output=I_nms_1;
[H,W]=size(output);
%je rends noir les bords de l'image
output(:,1)=zeros([1 H])';
output(:,W)=zeros([1 H])';
output(1,:)=zeros([1 W]);
output(H,:)=zeros([1 W]);
%j'enregistre les pixels qui sont détectés comme appartenant aux bords par le plus grand seuil t1
[strong_pixels_i,strong_pixels_j]=find(I_nms_1);
while ~isempty(strong_pixels_i)
for k=1:length(strong_pixels_i)
i=strong_pixels_i(k);
j=strong_pixels_j(k);
%après viennent des if assez lourds qui disent en gros que si les deux pixels au voisinage de (i,j) et appartenant à la direction perpendiculaire
%au gradient en (i,j) ont un gradient de norme >=t2 alors on les met à 1. Ceci est fait en distinguant 4 cas selon si le gradient en (i,j)
%est approximé par une direction horizontale, verticale, ou diagonale afin que l'on puisse identifié les 2 pixels voisins sur la direction
%perpendiculaire au gradient en (i,j).
end
end
[strong_pixels_i strong_pixels_j]=find(output & ~I_nms_1); % pour explorer les pixels aux bords qui viennent d'être mis à jour dans la boucle, on
va explorer leurs voisins.
I_nms_1=output;
end |
Malheureusement, quand j'exécute le programme sur un exemple, j'obtiens l'erreur suivante :
??? Attempted to access strong_pixels_i(2); index out of bounds because numel(stron_pixels_i)=1.
Error in ==> hyst_thresh at 26
i=strong_pixels_i(k);
Je ne comprend pas pourquoi il essaie d'accéder à une case qui est en dehors de la taille de strong_pixels_i. J'ai bien mis pour k les valeurs de 1 à length(strong_pixels_i) où length(strong_pixels_i) correspond au nombre d'éléments de strong_pixels_i.
Je serai reconnaissante pour toute aide,
Bien à vous.