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

Images Discussion :

[Débutante] Moyenner des images pixel par pixel


Sujet :

Images

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    78
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Mai 2007
    Messages : 78
    Points : 25
    Points
    25
    Par défaut [Débutante] Moyenner des images pixel par pixel
    Bonjour à tous, j'ai encore un probleme...

    Je dispose de différentes images représentant la concentration en matière en supension dans le golfe de gascogne (variable suspmat). Je souhaite les moyenner pixel par pixel pour avoir une image moyenne.

    La variable SuspMatt est une matrice MxN avec des valeurs qui correspondent à des concentration en matière en suspension en fonction des longitude et des latitudes.Mon problème c'est que pour chaque images, j'ai des pixels qui sont des NaN. Ce que je voudrait c'est que ces pixels ne soient pas pris en compte dans la moyenne . J'ai essayé le programme suivant mais ca ne me donne pas de bon résultats:


    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
    35
    36
    37
    38
    39
    40
    41
    42
     
    function moyimageMES
    % Moyenne des concentrations en MES
     
     
    SuspMatt1=nc_varget(file,'suspended_matters');
    lon1=nc_varget(file,'lon');
    lat1=nc_varget(file,'lat');
     
    somme=zeros(623,601);
    total=zeros(623,601);
     
    d=datenum('03/19/2006',23):datenum('03/20/2006',23); % en mettant les bonnes dates
     
    for n=1:numel(d)
     
       file=datestr(d(n),26);
       file=[strrep(file,'/','') '.nc'];
       if exist(file,'file')==2
     
    if(isnan(SuspMatt1)~=1)
        somme=imadd(somme,SuspMatt1);
        total= immad(total,1);
     
    else 
         somme=imadd(somme,0);
         total= immad(total,0);
     
    end
       end
     
    b=somme;
    c=total;
    moyenne=b/c;
     
     
    pcolor(lon1,lat1,moyenne)
     shading flat
     axis equal
     colormap(jet)
     caxis([0 100])
     colorbar
    J'ai l'impression que le problème est dans if(isnan(SuspMatt1)~=1).Pour une image donnée, dès que un de mes pixel est un NaN, le programme suit la boucle pour tous les pixels :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    else 
         somme=imadd(somme,0);
         total= immad(total,0);
    et du coup ma moyenne finale = 0 pour l'ensemble de l'image. Comment faire pour lui dire de ne pas prendre en compte seulement les pixels qui sont des NaN?

    Merci encore pour toute l'aide que vous pouvez m'apporter depuis ma découverte de Matlab et des joies de la programmation!!

  2. #2
    Membre éprouvé
    Avatar de rostomus
    Homme Profil pro
    Doctorant électronique et traitement du signal
    Inscrit en
    Décembre 2006
    Messages
    791
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant électronique et traitement du signal

    Informations forums :
    Inscription : Décembre 2006
    Messages : 791
    Points : 1 205
    Points
    1 205
    Par défaut
    Salut,

    essaie:
    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
     
    function moyimageMES
    % Moyenne des concentrations en MES
     
    SuspMatt1=nc_varget(file,'suspended_matters');
    lon1=nc_varget(file,'lon');
    lat1=nc_varget(file,'lat');
     
    somme=zeros(623,601);
    total=zeros(623,601);
     
    d=datenum('03/19/2006',23):datenum('03/20/2006',23); % en mettant les bonnes dates
     
    for n=1:numel(d)
     
       file=datestr(d(n),26);
       file=[strrep(file,'/','') '.nc'];
       if exist(file,'file')==2
     
          b=~isnan(SuspMatt1);  
          somme=somme+SuspMatt1.*b;
          total=total+b;
       end
    end
     
    moyenne=somme./total;

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    78
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Mai 2007
    Messages : 78
    Points : 25
    Points
    25
    Par défaut
    Salut,

    J'ai essayé ta formule mais ca ne marche pas: quand les valeurs de suspmat s'joutent (somme), le programme ajoute toujours les NaN .
    Je te met un programme simplifié pour te montrer :

    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 essai
     
    somme=zeros(3,4)
    total=zeros(3,4)
     
    for n=1:2
     
    suspmat=rand(3,4)
    suspmat(suspmat>0.5)=nan
     
       b=~isnan(suspmat)  
          somme=somme+suspmat.*b
          total=total+b
    end
    % end
     
    moyenne=somme./total
    Est ce que tu vois d'ou viens l'erreur?
    Merci pour ton aide!

  4. #4
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 828
    Points
    14 828
    Par défaut
    Ce ne serait pas plus simple de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    suspmat(isnan(suspmat))=0;%remplace les nan par des 0
    Mais je dit peut-être une bêtise...

    Et le problème vient du fait à mon avis que 0*Nan=Nan et pas à 0

  5. #5
    Membre éprouvé
    Avatar de rostomus
    Homme Profil pro
    Doctorant électronique et traitement du signal
    Inscrit en
    Décembre 2006
    Messages
    791
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant électronique et traitement du signal

    Informations forums :
    Inscription : Décembre 2006
    Messages : 791
    Points : 1 205
    Points
    1 205
    Par défaut
    Citation Envoyé par caro95470
    Ce ne serait pas plus simple de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    suspmat(isnan(suspmat))=0;%remplace les nan par des 0
    Mais je dit peut-être une bêtise...

    Et le problème vient du fait à mon avis que 0*Nan=Nan et pas à 0
    Salut,
    Oui, effectivement, vous avez raison.
    alors comme ça:
    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
     
    function essai
     
    somme=zeros(3,4);
    total=zeros(3,4);
     
    for n=1:2
     
          suspmat=rand(3,4);
          suspmat(suspmat>0.5)=nan;
     
          b=isnan(suspmat);
          suspmat(b)=0;
          somme=somme+suspmat;
          total=total+(~b);
    end
    % end
     
    moyenne=somme./total;

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    78
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Mai 2007
    Messages : 78
    Points : 25
    Points
    25
    Par défaut
    Ca marche très bien!!


    J'ai juste une petite question : à quoi sert le point apres somme:

    Merci beaucoup à tous pour votre aide!

  7. #7
    Membre éprouvé
    Avatar de rostomus
    Homme Profil pro
    Doctorant électronique et traitement du signal
    Inscrit en
    Décembre 2006
    Messages
    791
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant électronique et traitement du signal

    Informations forums :
    Inscription : Décembre 2006
    Messages : 791
    Points : 1 205
    Points
    1 205
    Par défaut
    Salut,

    Le point avant une opération arithmetique est pour faire l'opération élément par élement, et non pas une opération matricielle.

    A lire: http://www.mathworks.com/access/help...&submit=Search

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    78
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Mai 2007
    Messages : 78
    Points : 25
    Points
    25
    Par défaut
    D'accord! je vais me plonger dans la lecture des opérateurs arytmétiques de Matlab!

    Merci encore pour tout, mon projet avance à grand pas grace à vous!

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

Discussions similaires

  1. [Débutant] [VB.NET] Visionneuse d'image Pixel par Pixel
    Par c.kaito dans le forum Windows Forms
    Réponses: 0
    Dernier message: 29/09/2013, 18h10
  2. Réponses: 0
    Dernier message: 22/04/2009, 09h15
  3. Image a remplir Pixel par Pixel, Quel objet utiliser ?
    Par ZbergK dans le forum GTK+ avec C & C++
    Réponses: 5
    Dernier message: 28/02/2007, 21h35
  4. [ImageMagick] Parcourir une image pixel par pixel
    Par kip dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 05/10/2005, 14h10
  5. [VB6] [Graphisme] Transfert d'image pixel par pixel
    Par SpaceFrog dans le forum VB 6 et antérieur
    Réponses: 16
    Dernier message: 15/10/2002, 09h53

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