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 :

Deux boucles for vs vectorisation


Sujet :

MATLAB

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    343
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 343
    Points : 44
    Points
    44
    Par défaut Deux boucles for vs vectorisation
    Je débute en matlab, et je vous demande une vérification des deux codes:
    Mon premier code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    im1=imread(‘image1.jpg’);
    im2=imread(‘image2.jpg’);
     s=size(im2) ;
    image = zeros(s(1:2));             
            Z= uint8(im2);
            R=  Z(:,:,1);
            G = Z(:,:,2);
            B = Z(:,:,3); 
            res = (R>95) & (G>40) & (B>20) & max(im2, [], 3)-min(im2, [], 3)>15 & abs(R-G)>15 & R>B; 
            image =  res;
    Ou bien mon deuxième 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
    16
    17
    18
    19
    20
    21
    22
     
     
    im1=imread(‘image1.jpg’);
    im2=imread(‘image2.jpg’);
    s=size(im2) ;
    Z= uint8(im2);
    image= zeros(s(1:2));
         for i=1:s(1)%parcour row
           for j=1:s(2)%parcour col
     
            R=  Z(i,j,1);
            G = Z(i,j,2);
            B = Z(i,j,3); 
     
           if((R>95) & (G>40) & (B>20) & max(im2, [], 3)-min(im2, [], 3)>15 & abs(R-G)>15 & R>B) 
            image(i,j) =  1;
           else
            image(i,j) =  0;
           end
     
    end
    end
    Donc mon question est ce que la même chose de faire deux boucles For (i et j) pour tester chaque pixels ou bien de faire comme indique les deux points : avec le premier code ??

  2. #2
    Invité
    Invité(e)
    Par défaut
    Dans le 2ème code, la ligne
    if((R>95) & (G>40) & (B>20) & max(im2, [], 3)-min(im2, [], 3)>15 & abs(R-G)>15 & R>B)ne me semble pas correcte: max(im2(i,j,:))-min(im2(i,j,:))>15 serait plus juste.


    Dans ton 1er code, la ligne image = zeros(s(1:2)); est inutile ici, un simple
    image = (R>95) & (G>40) & (B>20) & max(im2, [], 3)-min(im2, [], 3)>15 & abs(R-G)>15 & R>B; suffit.
    Une autre remarque: je ne suis pas sûr que le cast Z= uint8(im2); soit justifié, im2 étant je pense déjà de type uint8 (à confirmer).

    Mais dans tous les cas, je te conseillerai ton premier code, qui est sous forme optimisée, et qui s'exécutera plus vite.
    Dernière modification par Invité ; 17/12/2011 à 22h21. Motif: MEF

  3. #3
    Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    343
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 343
    Points : 44
    Points
    44
    Par défaut
    Merci Winjerome pour ta réponse et tes remarques, mais t’as pas ma répondu sur ma principale question ‘est ce que la même chose de faire deux boucles For (i et j) pour parcourir pixel par pixel mon image et tester chaque pixels par la règle ou bien de faire comme indique les deux points : avec le premier code donc de prendre tous les lignes et les colonnes ??

  4. #4
    Invité
    Invité(e)
    Par défaut
    Le résultat final sera le même oui, ta variable image contiendra la même chose, seulement comme je te l'ai dit à la fin, le temps d'exécution sera plus long avec les deux boucles for.

  5. #5
    Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    343
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 343
    Points : 44
    Points
    44
    Par défaut
    pouvez vous me donnez une explication en utilisant les deux points : et comment il donne la même chose en utilisant les deux boucles For??

  6. #6
    Invité
    Invité(e)
    Par défaut
    Les deux codes reviennent à faire la même chose, le premier utilise ce que l'on appelle la méthode de vectorisation, l'autre fait le traitement pixel par pixel, je vois mal ce que je peux te dire de plus.
    Une utilisation de la fonction doc isequal pourra t'en convaincre.

  7. #7
    Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    343
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 343
    Points : 44
    Points
    44
    Par défaut
    merci Winjerome pour ton aide, j'ai vérifié avec la fonction isequal est il donne le même résultat.
    Jai consulté la page de vectorisation mais réellement j'ai pas compris comment se déroule le test. Donc peux tu m'expliqué encore avec un exemple simple?

  8. #8
    Invité
    Invité(e)
    Par défaut
    Et bien je pense que tes deux codes en sont un très bon exemple.
    On essai un maximum d'éviter les boucles qui ont tendance à ralentir le temps d'exécution, et utilise souvent l'indexage logique.

Discussions similaires

  1. Sortir de deux boucles FOR-END imbriquées
    Par Nabuchodonosor15 dans le forum MATLAB
    Réponses: 5
    Dernier message: 31/08/2009, 09h58
  2. Deux boucles for + un effet de bord ?
    Par Teufboy dans le forum Langage
    Réponses: 2
    Dernier message: 21/12/2007, 08h08
  3. Réponses: 3
    Dernier message: 24/05/2007, 17h56
  4. Batch - Deux boucle For imbriquées plus un FC
    Par Lorponos dans le forum Windows
    Réponses: 17
    Dernier message: 27/07/2006, 14h58
  5. comment quitter deux boucles for?
    Par davmaster62 dans le forum Général Python
    Réponses: 2
    Dernier message: 08/03/2006, 00h16

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