IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MATLAB Discussion :

Fonction dans une Fonction/"Algorithme parcours en profondeur"


Sujet :

MATLAB

  1. #1
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Novembre 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 22
    Points : 17
    Points
    17
    Par défaut Fonction dans une Fonction/"Algorithme parcours en profondeur"
    Bonjour a tous,
    je suis en train de taper un script dans le cadre d'un cour sur l'image processing et j'ai besoin d'aide. A un moment donné j'ai envie d'appeler une fonction dans une fonction mais ça bloque et je ne sais pas ou est le problème.

    Mon script est simple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    clear all;
     
    I=imread('cameraman.tif'); I=double(I);
     
    J=I; % Version of the image that we color (3 regions)
     
    %Parameters
    T=15; %Treshold
    i=100; % Coordonate x,y of the first seed
    j=100;
    % loop
    maf(i,j,T);
    Puis ensuite voici mon fichier fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    function [i,j] = maf(i,j,T)
     
    J(i,j)=0; %coloration of the first region 
     
     for x=i-1:1:i+1;
            for y=j-1:1:j+1;    %depth parcou algorythm
                if  abs(I(i,j)-I(x,y))<T && J(x,y)~=0 %test
                    J(x,y)=0;   %color the pixel
     
                    maf(i,j); %go "deeper"  Ici je rappell la fonction
     
                end
            end
     end
    end

    et voici l'erreur que je reçois:

    Undefined function 'I' for input arguments of type 'double'.
    
    Error in maf (line 7)
                if  abs(I(i,j)-I(x,y))<T && J(x,y)~=0 %test
    Quelqu'un a une idée? J'ai passé pas mal d'heures rien que sur ça et je sèche..

    Merci

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Dans une fonction, les seules variables connues (et utilisables donc) sont celles préalablement définies (maVariable = quelque chose), ainsi que les éventuelles entrées (à savoir ici i, j et T).
    I ayant été définie à l'extérieur de celle-ci, elle lui est donc inconnue.
    Il faut donc la faire passer en paramètre.

    Remarque : il en sera de même lors de l'appel récursif ligne 10 pour la variable T ; ainsi que J qui sera complètement redéfinie.

    Je conseille la lecture de ceci.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Novembre 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 22
    Points : 17
    Points
    17
    Par défaut
    Merci pour votre reponse.
    Est ce que je doit la definir en "global" ou il faut just que je la definisse a l'interieur du fichier fonction?

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    230
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 230
    Points : 352
    Points
    352
    Par défaut
    Il faut que tu passes ta matrice I en paramètres d'entrées de ta fonction maf.

    Sinon, il ne pourra jamais récupérer les valeurs de I.
    Ensuite, fais attention au niveau de déclarations de fonctions, car dans ton premier programme, tu as:
    Puis dans le deuxième :
    et plus loin :
    Matlab ne reconnait qu'un type d'écriture de fonction, donc si tu déclares ta fonction maf d'une certaine manière, celle-ci doit rester identique partout.
    Je ne réponds pas aux questions techniques via MP. Le but du forum est de permettre de trouver des solutions ensembles pour aider un ensemble de personnes.

    Loi du Chaos Informatique
    L’informatique, ça tient du chaos : une fois ça marche, une fois ça foire, tu sais pas pourquoi, c’est juste que tu viens de changer de lobe sur l’attracteur étrange.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Novembre 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 22
    Points : 17
    Points
    17
    Par défaut
    Merci pour vos reponse. Ca ne bloque plus comme avant mais j'ai une autre question. Est ce que une fonction matlab can changer une variable. En d'autre terme j'ai une image initiale sous forme de matrice (J) et apres que ma fonction est tourn'ee pas mal de fois je veux que quand j'ouvre J je vois des effet de cette fonction. Ca a un sens ou pas?
    (je suis plus ou moins debutant en Matlab)

    Merci

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    230
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 230
    Points : 352
    Points
    352
    Par défaut
    Si tu modifies l'image initiale, tu devrais voir les changements sur l'image à la fin du traitement.

    Du coup, tu peux utiliser des fonctions comme image, imshow,...Je te conseille la discussion suivante : Ici
    Je ne réponds pas aux questions techniques via MP. Le but du forum est de permettre de trouver des solutions ensembles pour aider un ensemble de personnes.

    Loi du Chaos Informatique
    L’informatique, ça tient du chaos : une fois ça marche, une fois ça foire, tu sais pas pourquoi, c’est juste que tu viens de changer de lobe sur l’attracteur étrange.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Novembre 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 22
    Points : 17
    Points
    17
    Par défaut
    Le probleme est que ma fonction ne semble pas affecter l'image initiale.

    voici le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
     
    clear all;
    I=imread('cameraman.tif'); I=double(I);
    J=I; % Version of the image that we color (3 regions)
     
    %Parameters
     
    T=6; %Treshold
     
    i=100; % Coordonate x,y of the first seed
    j=100;
     
    % loop
    maf(i,j,T,I,J);
    et pour la fonction je fait un essai en mettant seulement un changement pour UN pixel et il rest le meme quand je le verifie:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    function [i,j] = maf(i,j,T,I,J)
     
    J(i,j)=250;  % Il s'agit d'un test mais ca ne marche pas
     
     
    % %%
    % 
    % J(i,j)=250; %coloration of the first region 
    % 
    %  for x=i-1:1:i+1;
    %         for y=j-1:1:j+1;    %depth parcour algorythm
    %             if  abs(I(i,j)-I(x,y))<T && J(x,y)~=250 %test
    %                 J(x,y)=250;   %color the pixel
    %                 
    %                 maf(x,y,T,I,J); %go "deeper"
    %                
    %             end
    %         end
    %  end%%
    end
    Comment faire pour que cette fonction modifie mon J? Y'a t'il un probleme dans sa declaration?

    Merci

  8. #8
    Invité
    Invité(e)
    Par défaut
    C'est ce que je t'ai dit :

    Citation Envoyé par Winjerome Voir le message
    Remarque : il en sera de même lors de l'appel récursif ligne 10 pour la variable T ; ainsi que J qui sera complètement redéfinie.
    Une fonction, c'est comme un bloc auquel tu rentres des variables, et qui t'en redonne.
    Même si tu utilises des variables ayant le même nom, celle-ci sont complètement différentes.

    Je t'invite à taper doc function.

  9. #9
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Novembre 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 22
    Points : 17
    Points
    17
    Par défaut
    En effet j'ai compris la difference avec la variable globale. Merci.

    Mon programme est maintenant termine. Mais etant assez debutant en matlab j'ai un dernier probleme. C'est extremement lent et matlab crash au bout de 1800 pixel du coup je ne peut pas augmenter le nombre d'iteration. Aucune idee pour remedier a ca? Auncune simplification possible?
    Merci
    ps: le programme decoupe des image par regions)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
     
    clear all;
     
    I=imread('et1.tiff'); I=double(I);
     
    global J;
     
    J=I; % Version of the image that we color
     
    %Parameters
     
    T=6; %Treshold
     
    i=250; % Coordonate x,y of the seed
    j=250;
     
    set(0,'RecursionLimit',1200); %we can change it to imcrease the size of the region
     
    % loop
    maf(i,j,T,I,J);
     
    imshow(uint8(I)) % original image
    imshow(uint8(J)) % result

    et la fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    function [i,j] = maf(i,j,T,I,J)
     
    global J;
     
     
    J(i,j)=250; %coloration of the first region 
     
     
     for x=i-1:1:i+1;
            for y=j-1:1:j+1;    %depth parcour algorythm
                if  abs(I(i,j)-I(x,y))<T && J(x,y)~=250 %test
                    J(x,y)=250;   %color the pixel
     
                    %if x>-1 && x<255 && y>-1 && y<255
     
                    maf(x,y,T,I,J); %go "deeper"
     
                    %end
     
                end
            end
     end
    end

  10. #10
    Invité
    Invité(e)
    Par défaut
    Si tu le déclares en global, inutile de le faire passer en paramètre.

    Pour éviter l'erreur que tu obtiens, il faut vérifier que tu ne dépasses pas les bords de ton image.
    Donc quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if x>0 && x<=M && y>0 && y<=N
    M et N respectivement la hauteur et largeur de l'image, mais avant de vouloir accéder à J(x,y)
    Attention que les indices en MATLAB commencent à 1 et non 0.

    abs(I(i,j)-I(x,y))<T && J(x,y)~=250 J(x,y)~=250 && abs(I(i,j)-I(x,y))<T rien ne sert de vérifier le seuil si J(x,y) est déjà à 250.

    Sinon, tu peux t'inspirer du contenu de cette contribution du FEX.

  11. #11
    FLB
    FLB est déconnecté
    Modérateur
    Avatar de FLB
    Homme Profil pro
    Ing. Aérospatiale
    Inscrit en
    Juin 2003
    Messages
    770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ing. Aérospatiale
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2003
    Messages : 770
    Points : 1 185
    Points
    1 185
    Par défaut
    Plutôt que déclarer J global (ce qui est en général à éviter), il vaut mieux le faire passer en paramètre et le récupérer :
    Dans ton script tu récupères la valeur de J modifié avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [i j J] =maf(i,j,T,I,J);
    puis dans la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    function [i,j, J] = maf(i,j,T,I,J)
     
    J(i,j)=250; %coloration of the first region 
    for x=i-1:1:i+1;
            for y=j-1:1:j+1;    %depth parcour algorythm
                if  abs(I(i,j)-I(x,y))<T && J(x,y)~=250 %test
                    J(x,y)=250;   %color the pixel
     
                    if x>0 && x<257 && y>0 && y<257 %256x256 pixels
     
                        [i, j, J] = maf(x,y,T,I,J); %go "deeper"
     
                    end
     
                end
            end
     end
    end

  12. #12
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Novembre 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 22
    Points : 17
    Points
    17
    Par défaut
    Merci Winjerome pour les modification, je comprend comment elle accéléré le programme.

    Par contre FLB j'ai suivi tes instruction est pas déclaré la variable en global et soit j’omets dans la fonction d’écrire [i,j,J] , ( donc je ne tape que maf(x,y,T,I,J);) et la ça ne marche pas c'est a dire que J n'est pas modifie.

    Soit je tape bien [i,j,J] = maf(x,y,T,I,J); et la non plus ça ne semble pas modifier J mais en plus MATLAB bloque.

    Quelqu'un pour m'aider svp?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    clear all;
     
    I=imread('et1.tiff'); I=double(I);
     
    J=I; % Version of the image that we color
     
    %Parameters
     
    T=6; %Treshold
     
    i=250; % Coordonate x,y of the seed
    j=250;
     
     
    set(0,'RecursionLimit',500); %we can change it to imcrease the size of the region
     
     
    % loop
    [i,j,J]=maf(i,j,T,I,J);
     
    imshow(uint8(I)) % original image
    imshow(uint8(J)) % result

    FONCTION

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    function [i,j,J] = maf(i,j,T,I,J)
     
     
    J(i,j)=250; %coloration of the first region
     
     
    for x=i-1:1:i+1;
        for y=j-1:1:j+1;    %depth parcour algorythm
     
            if y>0 && y<=255 && x>0 && x<=255
     
                if   J(x,y)~=250 && abs(I(i,j)-I(x,y))<T %test
     
     
                    J(x,y)=250;   %color the pixel
     
                    [i,j,J] = maf(x,y,T,I,J); %go "deeper"
     
                end
     
            end
        end
    end
    end

  13. #13
    Invité
    Invité(e)
    Par défaut
    Ta ligne 15 : J(x,y)=250; %color the pixel est redondante : tu le fais déjà en rentrant dans la fonction.

    Sinon, attention au fait que tu retournes les indices i et j [i j J] = maf(...) : ils viennent changer tes i et j initiaux.

  14. #14
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Novembre 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 22
    Points : 17
    Points
    17
    Par défaut
    Le probleme maintenant depuis que ma variable J n'est plus global, a la fin de la fonction J n'est plus modifiee.
    Pourquoi?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Appel d'une fonction dans une fonction d'une même classe
    Par script73 dans le forum Général Python
    Réponses: 3
    Dernier message: 06/03/2015, 10h18
  2. Response.Redirect dans une fonction dans une classe
    Par jpower dans le forum ASP.NET
    Réponses: 14
    Dernier message: 24/08/2007, 09h45
  3. Appeler une fonction dans une fonction
    Par bryanstaubin dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 18/06/2007, 09h39
  4. Import d'une fonction, dans une fonction
    Par Goupo dans le forum Général Python
    Réponses: 2
    Dernier message: 12/01/2007, 16h50
  5. [PHP-JS] une fonction dans une fonction
    Par lodan dans le forum Langage
    Réponses: 6
    Dernier message: 25/06/2006, 19h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo