Seuillage par hystérésis (hysteresis thresholding) dans le détecteur de Canny
Répondre à la discussion
Affichage des résultats 1 à 2 sur 2

Seuillage par hystérésis (hysteresis thresholding) dans le détecteur de Canny



  1. #1
    sknbernoussi

    Seuillage par hystérésis (hysteresis thresholding) dans le détecteur 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:
    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]);
    
    [strong_pixels_i,strong_pixels_j]=find(I_nms_1);
    
    while ~isempty(strong_pixels_i)
        for k=1:length(strong_pixels_i)
            i=edges_to_visit_i(k); 
            j=edges_to_visit_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 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 :

    Code:
    ??? 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.

    -----
    Dernière modification par sknbernoussi ; 11/10/2014 à 17h37.

  2. #2
    sknbernoussi

    Re : Seuillage par hystérésis (hysteresis thresholding) dans le détecteur de Canny

    Dans la boucle for incluse dans la boucle while, il faut remplacer edges_to_visit_i et edges_to_visit_j par strong_edges_i et strong_edges_j

Discussions similaires

  1. hysteresis
    Par sanita dans le forum Physique
    Réponses: 0
    Dernier message: 07/04/2014, 14h21
  2. Hystérésis
    Par invite7d728e29 dans le forum Physique
    Réponses: 6
    Dernier message: 08/09/2013, 15h57
  3. Dédoublement dans la courbe de cycle hysteresis
    Par said76 dans le forum Physique
    Réponses: 13
    Dernier message: 25/04/2013, 15h46
  4. Réponses: 3
    Dernier message: 19/11/2011, 20h32
  5. Hystérésis
    Par invite78f958b1 dans le forum Électronique
    Réponses: 7
    Dernier message: 19/01/2011, 21h04