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 :

programmation matlab (boucles et sélection)


Sujet :

MATLAB

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Février 2010
    Messages
    129
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 129
    Par défaut programmation matlab (boucles et sélection)
    Bonjour
    J'essaye de simuler ces 2 étapes ss Matlab pour une utilisation ultérieure du résultat.

    •1ère étape : Calcul de l’image moyenne M

    Pour chaque Pixel G(i,j) de l’image G faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
               Si  G(i,j) est un Pixel de bordure alors 
                    M(i,j)= G(i,j)
               Sinon   
                M(i,j)= [som de (G(m,n))]/9; avec m= i-1:i+1; n=j-1:j+1;)
    • 2ème étape : calcul de l’image variance locale VL

    Pour chaque Pixel G(i,j) de l’image G faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     Si G(i,j) est un Pixel de bordure alors 
                  VL(i,j) = G(i,j)
               Sinon VL(i,j)= [som de (carré (G(m,n)-M(i,j))]/9; avec m= i-1:i+1; n=j-1:j+1;)

    • 3ème étape : calcul de l’image variance V

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     Pour chaque Pixel VL(i,j) de l’image VL faire
     
                            V (i,j) =  30*log10(1+sqrt(VL(i,j)))

    Exemple numérique :

    Afin de simuler l'algorithme, Il prennent G une matrice 3*3,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    G=[200 230 0;150 90 97; 160 40 255]
    et ils obtiennent

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	G(i,j)  =90 ;
    	M(i,j)= (200+230+0+150+90+97+160+40+255)/9  = 135 (on prend le nombre entier)
    	VL(i,j)= [(200-135)²+ (230-135)²+ (0-135)²+ (150-135)²+ (90-135)²+ (97-135)²+ (160-135)²+ (40-135)²+ (255-135)²] /9  =   7557
    	      =  58

    Voici le programme que j'ai écris sous MATLAB

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    clear
    clc
    close all
    G=[200 230 0;150 90 97;160 40 255]
    %Calcul de M, VL, V, moyenne, variance locale et variance  de l'image G
    [L,C]=size(G);
    for i=1:L
     
        for j=1:C
        % traitement des pixels de bord de G
        if i==1 | i==L |j==1 | j==C
            M(i,j)=G(i,j)
            VL(i,j)=G(i,j)
            V(i,j)=30*log10(1+sqrt(VL(i,j)))
        else
            % traitement des autres pixels de G 
            som1=0;
            som2=0;
            for k=i-1:i+1
                for l=j-1:j+1
            %pavet de 9 pixels
            som1=som1+ G(k,l)
            % calcul de la matrice de variance locale sur des pavets de 3*3
            % pixel centré sur le pixel P(i,j)
            som2=som2+ (G(k,l)-M(i,j))^2
                end
            end
            M(i,j)=floor(som1/9)
            VL(i,j)=floor(som2/9)
            V(i,j)=30*log10(1+sqrt(VL(i,j)))
       end
      %keyboard
       end 
    end
    Ceci me donne le bon résultat pour M(i,j) mais pas la bonne variance pour L(i,j)=VL(2,2). Je ne trouve pas 7557.
    Où est le problème? Je ne fais que recommencer la compilation mais vainement, voudriez vous me dire où est l’erreur dans mon code source MATLAB?

    Mes remerciements

  2. #2
    Membre Expert
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Par défaut
    Essaie ceci :

    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
    26
    27
     
    % Initilaisation
        clc ;
        clear all ;
        G = [200 230   0  ; ...
             150  90  97  ; ...
             160  40 255] ;
     
        [nL nC] = size(G) ;
     
    % Traitement
        M  = zeros(size(G)) ;
        VL = zeros(size(G)) ;
        for i=1:nL 
            for j=1:nC
                % Vérification si on est sur les bords de l'image
                if i==1 || i==nL || j==1 || j==nC
                    M(i, j)  = G(i, j) ;
                    VL(i, j) = G(i, j) ;
                else
                    M(i, j)  = sum(sum(G(i-1:i+1, j-1:j+1)))/9 ;
                    VL(i, j) = sum(sum( (G(i-1:i+1, j-1:j+1)-M(i, j)).^2)) ;
                end
            end
        end
     
        VL(2,2)

  3. #3
    Membre confirmé
    Inscrit en
    Février 2010
    Messages
    129
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 129
    Par défaut
    Bonjour
    Tout d'abord grand merci pour toujours donné suite à mes questions

    dans la formule de VL il manquait /9 que j'ai rajouté. Les résultats doivent être entiers et dc j'ai pensé utiliser la fonction floor comme vous pourriez le voir ci dessous. J'ai aussi recalculé la quantité VL(2,2) selon l'algorithme qu'ils ont donné. le résultat est affecté à la variable r.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     M(i, j)  = sum(sum(G(i-1:i+1, j-1:j+1)))/9 ;
                    M(i,j)=floor(M(i,j))
                    VL(i, j) = sum(sum( (G(i-1:i+1, j-1:j+1)-M(i, j)).^2))/9 ;
                    VL(i,j)=floor(VL(i,j))
                end
            end
        end
     
        VL(2,2)
      r= ((200-135)^2+ (230-135)^2+ (0-135)^2+ (150-135)^2+ (90-135)^2+ (97-135)^2+ (160-135)^2+ (40-135)^2+ (255-135)^2)/9
    en utilisant la fonction floor on trouve exactement le mm résultat puisque la différence est ds la partie décimale, (mais c différent de ce qu'il disent avoir trouvé 7557)
    sans la fonction floor, je trouve respectivement
    VL(2,2)=ans =

    6.5793e+003


    r =

    6.5799e+003

    que pourrait on dire??
    Mes remerciements

  4. #4
    Membre Expert
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Par défaut
    Et maintenant, tu as les bons résultats ou il existe toujours une erreur de résultat ?

  5. #5
    Membre confirmé
    Inscrit en
    Février 2010
    Messages
    129
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 129
    Par défaut boucle et sélection
    justement voici ce que je trouve

    d'après le code Matlab
    VL(2,2)=ans =

    6.5793e+003

    d'après leur algorithme
    r =

    6.5799e+003

    il y a y une petite différence dans la partie décimale (en gras). Comment est jugé le résultat du code Matlab (juste ou faux) , puisque la fonction sum n'utilise pas du calcul approché. Les étapes de calcul sont similaire à une somme ordinaire de termes.
    En fait floor donne la partie entière d'un nombre. Elle est la seule???

  6. #6
    Membre confirmé
    Inscrit en
    Février 2010
    Messages
    129
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 129
    Par défaut
    en fait :-)! un help de floor donne ceil, round, et fix.
    fix et floor posent une certaine cnfusion. Pourrais je avoir un exemple numérique s'il vous plait

  7. #7
    Membre Expert
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717

Discussions similaires

  1. Aide programme Matlab
    Par thouraya_ad dans le forum MATLAB
    Réponses: 6
    Dernier message: 06/03/2007, 18h59
  2. [Débutant] Programmer une boucle
    Par driver dans le forum Pascal
    Réponses: 2
    Dernier message: 25/02/2007, 20h59
  3. Exécuter un programme MATLAB sur un pc sans MATLAB
    Par zuly12 dans le forum MATLAB
    Réponses: 4
    Dernier message: 10/01/2007, 15h44
  4. Réponses: 1
    Dernier message: 18/05/2006, 12h52
  5. Programmer une boucle de saisie chaine de caractère.
    Par Spike Spiegel dans le forum C
    Réponses: 30
    Dernier message: 02/10/2005, 17h46

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