Précédent   Forum des professionnels en informatique > Environnements de développement > MATLAB > Images
Images Forum d'entraide sur le traitement d'images en MATLAB
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
Vieux 07/09/2010, 07h18   #1
Invité de passage
 
Inscription : septembre 2010
Messages : 10
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 10
Points : 1
Points : 1
Par défaut [bwlabel] calculs de statistiques dans des surfaces seuillees

Bonjour a tous,

Je travaille avec des images satellites afin de cartographier la vegetation dans le desert Australien. J'ai un programme qui me permet de calculer des statistiques (superficie, moyenne, valeur max...) dans une region precise, delimité par un seuil et une localisation (i.e je garde les valeurs > seuil et les plus pres de la position definie par les coordonnées X,Y).

Ce programme utilise la fonction bwlabel.
Je voudrais effectuer les memes calculs mais en considerant l'ensemble des "paquets/zones" superieur a mon seuil (sans garder uniquement la zone la plus proche du point X,Y)

J'ai essaye de remplacer dans le code :
Code :
1
2
VEGETcarto = Data.*(L==idx)
par un
Les surface delimitees semble bonnes mais pas les valeurs calculees (la carte affichee et les statistiques calculees sont fausses...

Quelqu'un a t'il une idee d'ou vient l'erreur??

Merci beaucoup,
Caroline


Code :
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
function [VEGETcarto,MAXVEGET,MINVEGET,MOYENNEVEGET,MEDIANVEGET,SUPERFICIEVEGET,VALEmb]=Sat_Stat(Data,Seuil,dx,dy,LonX,LatY,yemb)

  %========================================================
 % Calcul de la hauteur et largeur des pixels Modis (en mètre)
 % Rt : rayon terre 
 %========================================================
   Rt=6378140;
   dym=Rt*dy*pi/180./1000.;
   dxm=Rt*dx*pi/180.*cos(pi*yemb/180.)/1000.;

%======================================================== 
% Délimitation des surfaces et calculs des indices statistiques
%========================================================

% Délimitation des surface
%--------------------------

   BW = Data > Seuil;                % matrice avec des 1 qd l inegalite est vraie
   [L, num] = bwlabel(BW);           % On separe les differents paquets
   %figure
   %fig=figure(100);clf 
   %pcolor(L); shading interp;      % Pour observer les régions sélectionnées 

  reg = regionprops(L);             % Proprietes des paquets (regions)
       
   for n=1:num  
      [y,x] = find(L == n);          % Positions associees a une region
      d(n) = min(sqrt((LonX-x).^2+(LatY-y).^2)); % Calcul distance / (LonX,LongY)
      %disp(['n : ' int2str(n) '  d : ' num2str(d(n))]) % Pour afficher les différentes distances calculées
   end
   %idx = find(d<=Dist);
   minim=min(d); % permet de selectionner la "surface" la plus proche d'un point fixe
   idx = find(d<=minim); 
   [pasbesoin,idx2] = sort([reg(idx).Area]);
   idx = idx(idx2(end));

   
%calcul des indices satistiques dans la surface selectionnée
%------------------------------------------------------------
  
%    VEGETcarto = Data.*(L==idx) 
%    VEGET= Data.*(L==idx); 
%    VEGET(find(VEGET==0))=NaN;
%    VEGET=VEGET(finite(VEGET)); 
%    VALEmb = Data(LatY,LonX); 
%    MAXVEGET = max(VEGET(:));
%    MINVEGET = min(VEGET(:));
%    MOYENNEVEGET = mean(mean(VEGET));
%    MEDIANVEGET  = median(median(VEGET));
%    SUPERFICIEVEGET = sum(L(:)==idx(:));
%    disp(['     Nbre Pixels VEGET : ' int2str(SUPERFICIEVEGET)])
%    SUPERFICIEVEGET=SUPERFICIEVEGET*dxm*dym;

%calcul des indices satistiques dans l'ensemble des surfaces
%------------------------------------------------------------

   VEGETcarto = Data.*(L) 
   VEGET= Data.*(L) 
   VEGET(find(VEGET==0))=NaN;
   VEGET=VEGET(finite(VEGET)); 
   VALEmb = Data(LatY,LonX); 
   MAXVEGET = max(VEGET(:));
   MINVEGET = min(VEGET(:));
   MOYENNEVEGET = mean(mean(VEGET));
   MEDIANVEGET  = median(median(VEGET));
   SUPERFICIEVEGET = sum(L(:));
   disp(['     Nbre Pixels VEGET : ' int2str(SUPERFICIEVEGET)])
   SUPERFICIEVEGET=SUPERFICIEVEGET*dxm*dym;
    
   
end

Dernière modification par Dut ; 07/09/2010 à 07h42.
KrokroAus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/09/2010, 07h40   #2
Dut
Rédacteur/Modérateur
 
Avatar de Dut
 
Inscription : novembre 2006
Messages : 12 322
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : novembre 2006
Messages : 12 322
Points : 14 810
Points : 14 810
Pour ne prendre en compte toutes les régions d'intérêt et effectuer les calculs d'un seul coup, tu fais "simplement" :

Code :
VEGETcarto = Data.*(L>0)
Comme ça, tu appliques le masque binaire dont les valeurs 1 (vraies) sont celles qui correspondent aux valeurs non nulles de L (donc au numéro des régions d'intérêt détectées)
__________________
Mes contributions MATLAB (R2009a - Windows & Linux)

• J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" (Saint Huck)
• Des larmes coulèrent doucement des yeux fermés du vieil homme. Moi je pleurais comme un enfant, que d'ailleurs pour lui je ne cesserais d'être ma vie durant (Amkoullel)

• Lâché de Mogwai sur St Malo... aie aie aie... ouille ouille ouille
Dut est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/09/2010, 07h50   #3
Invité de passage
 
Inscription : septembre 2010
Messages : 10
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 10
Points : 1
Points : 1
Super! Merci enormement pour cette reponse rapide!

Pour le calcul de ma surface totale c'est pareil? En ecrivant :
Code :
1
2
3
4
   VEGETcarto = Data.*(L>0) 
   VEGET= Data.*(L>0) 
   SUPERFICIEVEGET = sum(L(:)>0);
J'ai bien la superficie totale i.e de l'ensemble de mes surfaces repondant a la condition valeurImage > seuil ??

merci en tout cas!
KrokroAus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/09/2010, 08h30   #4
Dut
Rédacteur/Modérateur
 
Avatar de Dut
 
Inscription : novembre 2006
Messages : 12 322
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : novembre 2006
Messages : 12 322
Points : 14 810
Points : 14 810
Citation:
Envoyé par KrokroAus Voir le message
Pour le calcul de ma surface totale c'est pareil? En ecrivant :
Code :
1
2
3
4
   VEGETcarto = Data.*(L>0) 
   VEGET= Data.*(L>0) 
   SUPERFICIEVEGET = sum(L(:)>0);
J'ai bien la superficie totale i.e de l'ensemble de mes surfaces repondant a la condition valeurImage > seuil ??
Oui... sauf que les deux premières lignes ne servent à rien dans ce calcul

Sinon dans ton code, tu peux faire quelques améliorations...
Citation:
Envoyé par KrokroAus Voir le message
Comme tu ne calcules que les surfaces :
Code :
reg = regionprops(L,'Area');
Citation:
Envoyé par KrokroAus Voir le message
Code :
1
2
3
4
   minim=min(d); % permet de selectionner la "surface" la plus proche d'un point fixe
   idx = find(d<=minim); 
   [pasbesoin,idx2] = sort([reg(idx).Area]);
   idx = idx(idx2(end));
revient à faire "simplement"

Code :
[pasbesoin,idx] = min(d);
Citation:
Envoyé par KrokroAus Voir le message
Code :
   VEGET(find(VEGET==0))=NaN;
Avec l'indexage logique :
Citation:
Envoyé par KrokroAus Voir le message
Code :
1
2
   MOYENNEVEGET = mean(mean(VEGET));
   MEDIANVEGET  = median(median(VEGET));
Comme pour la fonction SUM :
Code :
1
2
   MOYENNEVEGET = mean(VEGET(:));
   MEDIANVEGET  = median(VEGET(:));
Voila, j'espère ne pas avoir écrit de bêtises
__________________
Mes contributions MATLAB (R2009a - Windows & Linux)

• J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" (Saint Huck)
• Des larmes coulèrent doucement des yeux fermés du vieil homme. Moi je pleurais comme un enfant, que d'ailleurs pour lui je ne cesserais d'être ma vie durant (Amkoullel)

• Lâché de Mogwai sur St Malo... aie aie aie... ouille ouille ouille
Dut est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/09/2010, 09h08   #5
Invité de passage
 
Inscription : septembre 2010
Messages : 10
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 10
Points : 1
Points : 1
Super! Merci beaucoup pour ton aide!
Une derniere question : est t'il possible d'extraire les coordonnees geographiques correspondant aux surface selectionnees, ie repondant a la condition > seuil?
KrokroAus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/09/2010, 09h47   #6
Dut
Rédacteur/Modérateur
 
Avatar de Dut
 
Inscription : novembre 2006
Messages : 12 322
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : novembre 2006
Messages : 12 322
Points : 14 810
Points : 14 810
Citation:
Envoyé par KrokroAus Voir le message
extraire les coordonnees geographiques correspondant aux surface selectionnees
Qu'entends-tu par "coordonnées géographiques" ?

Ceux des pixels à l'intérieur de la zone ?
Les sommets du polygone frontière ?
Dans quel système d'unité (pixel, métrique, longitude/latitude) ?
__________________
Mes contributions MATLAB (R2009a - Windows & Linux)

• J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" (Saint Huck)
• Des larmes coulèrent doucement des yeux fermés du vieil homme. Moi je pleurais comme un enfant, que d'ailleurs pour lui je ne cesserais d'être ma vie durant (Amkoullel)

• Lâché de Mogwai sur St Malo... aie aie aie... ouille ouille ouille
Dut est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2010, 03h57   #7
Invité de passage
 
Inscription : septembre 2010
Messages : 10
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 10
Points : 1
Points : 1
J'entends par "coordonnees" les coordonnes (en lat/lon) des pixels a l'interieur des surfaces definies par la condition valeur > seuil.
KrokroAus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2010, 07h35   #8
Dut
Rédacteur/Modérateur
 
Avatar de Dut
 
Inscription : novembre 2006
Messages : 12 322
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : novembre 2006
Messages : 12 322
Points : 14 810
Points : 14 810
Pour récupérer les coordonnées des pixels à l'intérieur de chaque région, tu peux faire comme ceci (à adapter à ton problème bien entendu) :

Code :
1
2
3
4
5
[L, num] = bwlabel(...);

for n = 1:num
   [row,col] = find(L==n);
end
Ensuite pour la conversion vers le système de coordonnées final, cela dépend des paramètres de ton image initiale (système de coordonnées, projection, origine, ...)

Note déjà que FIND renvoie d'abord les indices des lignes puis ceux des colonnes... dans un système cartésien, les lignes correspondent aux ordonnées (axe y), et les colonnes aux abscisses (axe x)
__________________
Mes contributions MATLAB (R2009a - Windows & Linux)

• J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" (Saint Huck)
• Des larmes coulèrent doucement des yeux fermés du vieil homme. Moi je pleurais comme un enfant, que d'ailleurs pour lui je ne cesserais d'être ma vie durant (Amkoullel)

• Lâché de Mogwai sur St Malo... aie aie aie... ouille ouille ouille
Dut est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/09/2010, 01h55   #9
Invité de passage
 
Inscription : septembre 2010
Messages : 10
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 10
Points : 1
Points : 1
Merci pour ton aide et desole pour la reponse tardive!
Je vais tester ca!
KrokroAus est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +1. Il est actuellement 18h40.


 
 
 
 
Partenaires

Hébergement Web