Programme matlab

Résolu/Fermé
ghadatou - 12 févr. 2009 à 13:19
Fee Fay Messages postés 635 Date d'inscription vendredi 17 octobre 2008 Statut Membre Dernière intervention 31 mai 2009 - 13 févr. 2009 à 01:19
Bonjour,
je veux savoir comment calculer la variance de chaque pixel d'une image en niveau de gris utilisant une fenêtre 5*5 qui normalement doit parcourir toute la matrice de l'image et à chaque transition calcul la variance de la nouvelle matrice et le résultat sera pris par le pixel au centre; tout çà parait clair sauf que j'ai du mal à le transformer en programme exécutable :( la seule chose que je sais faire c'est d'utiliser la fonction "var" or que cette dernière calcule la variance de toute l'image ;mon but finalement est d'avoir un histogramme "imhist" qui indique la variance (5*5) en fonction du nombre de pixels
NB: taille de l'image(lena) est 512*512

aider moi svp , et merci d'avance

3 réponses

Fee Fay Messages postés 635 Date d'inscription vendredi 17 octobre 2008 Statut Membre Dernière intervention 31 mai 2009 377
12 févr. 2009 à 19:24
Bonsoir
Je ne suis pas sûr d'avoir compris exactement ce que tu voulais faire, mais si j'ai bien saisi, il suffit que tu fasses tout simplement deux boucles pour pouvoir récupérer toutes les matrices 5x5 de l'image.
Ou si tu ne veux pas faire de boucle, quelque chose de ce genre devrait convenir pour pouvoir avoir toutes tes matrices 5x5 organisées dans un tableau à 4 dimensions de taille 5x5x507x507
%% On définit une matrice M pour l'exemple
n=512;
M=rand(n);
%% Récupération des petites matrices
[jj ii]=meshgrid(3:n-2);
ii=reshape(ii,numel(ii),1);
jj=reshape(jj,numel(jj),1);
kk=sub2ind([n n],ii,jj);
kk=repmat(kk,[1 5]);
kk=kk+repmat(-2:2,[size(kk,1) 1]);
kk=repmat(kk,[1 5]);
a=reshape(repmat(n*(-2:2),[5 1]),[1 25]);
kk=kk+repmat(a,[size(kk,1) 1]);
kk=reshape(kk.',[numel(kk) 1]);
%% Tableau à 4 dimensions
MM=reshape(M(kk),[5 5 n-4 n-4]);
Bonne nuit
2
bonsoir,
je ré-explique : j'ai une image LENA en niveau de gris de taille 512*512, je veux calculer la moyenne et la variance de chaque pixel de la matrice I de l'image LENA , en appliquant une fenêtre 5*5; donc cette fenêtre va parcourir la matrice I comme si elle était un tableau de 512 ligne et 512 colonnes; et à chaque transition mon programme doit calculer la moyenne de cette nouvelle matrice (comme si j'ai un filtre moyenneur) et la moyenne obtenue est celle du pixel au centre ...
le but est d'avoir un histogramme moyenne 5*5 en fonction du nombre de pixels et même chose pour la variance c'est à dire que en parcourant la matrice I de l'image on peut trouver par exemple 50 pixels qui ont la même valeur de moyenne ( ou de la variance), 300 pixels qui ont une autre valeur de la moyenne etc... donc suivant le résultat du calcul je peux avoir l'histogramme souhaité

merci pour votre attention
0
Fee Fay Messages postés 635 Date d'inscription vendredi 17 octobre 2008 Statut Membre Dernière intervention 31 mai 2009 377
13 févr. 2009 à 01:19
Ces quelques lignes construisent juste toutes les petites matrices 5x5 en parcourant tous les pixels entre 3 et 510. Toutes ces petites matrices sont alors organisées dans un tableau à 4 dimensions.
Les deux premières dimensions correspondent aux petites matrices 5x5, les deux autres dimensions correspondent au pixel où elles sont centrées, enfin... pas tout à fait pour être exact.... Le pixel correspondant au centre d'une matrice 5x5 a nécessairement des indices compris entre 3 et 510 mais le tableau 4D est indexé à partir de 1, ce qui veut dire qu'il y a un décalage de 2 dans l'indexation. Par exemple :
MM(:,:,3,10);
Te donnera la matrice 5x5 centrée sur le pixel (5,12) (3+2=5,10+2=12).

Si tu veux une description du programme, cela n'a rien de très palpitant, il s'agit juste de bricolage pour éviter de faire des boucles. Donc tout est fait à grands coups de repmat, de reshape et de sub2ind.
%% Ligne utilisée pour construire les indices de tous les centres
[jj ii]=meshgrid(3:n-2);
%% Redimensionnement pour n'avoir qu'une colonne 
ii=reshape(ii,numel(ii),1);
%% Redimensionnement pour n'avoir qu'une colonne 
jj=reshape(jj,numel(jj),1);
%% Indexation linéaire de tous les centres (un seul indice)
kk=sub2ind([n n],ii,jj);
%%  Répétition des indices dans le but de construire
%% les indices des colonnes centrales de chaque matrice
kk=repmat(kk,[1 5]);
%% Indices des lignes de chaque matrice
kk=kk+repmat(-2:2,[size(kk,1) 1]);
%% Répétition des indices dans le but de construire les indices des éléments de chaque matrice
kk=repmat(kk,[1 5]);
%% Indices des éléments de chaque matrice
a=reshape(repmat(n*(-2:2),[5 1]),[1 25]);
kk=kk+repmat(a,[size(kk,1) 1]);
kk=reshape(kk.',[numel(kk) 1]);
%% En prenant M de chaque indices
%% on obtient toutes petites matrices 5x5
%% pour tous les pixels, elles se suivent toutes
%% dans une seule colonne
%% les 25 éléments de chaque colonne
%% les uns à la suite des autres
MM=reshape(M(kk),[5 5 n-4 n-4]);
En ce qui concerne ton petit programme, la fonction medfilt2 est faite pour remplacer les éléments d'une matrice par la médiane de ses voisins ; ici, il s'agit de la variance que tu veux.
Au passage, je ne connaissais pas cette fonction.
1
Fee Fay Messages postés 635 Date d'inscription vendredi 17 octobre 2008 Statut Membre Dernière intervention 31 mai 2009 377
12 févr. 2009 à 19:48
Donc il s'agit bien de ce que je viens d'écrire.
Il ne reste plus qu'à exploiter le tableau à 4 dimensions des quelques lignes que je viens d'écrire pour calculer et tracer tout ce que tu voudras.
0
bonsoir,
monsieur est ce que vous pouvez ajouter quelques commentaires dans votre programme proposé parce que j'avoue que je débute avec matlab et j'arrive pas à bien comprendre donc j'arrive pas à en rajouter ces quelques lignes dont vous m'avez parler
aidez moi svp
0
j'ai essayé ce petit programme:
Code :

B = medfilt2(I, [5 5])
%figure, plot (B)
figure, imhist (B)
title('moyenne 5*5');
xlabel('moyenne 5*5')
ylabel('nombre de pixel')

et je voulais savoir est ce qu'il présente la solution pour mon problème c.à dire est ce que ce programme calcule bien la moyenne de chaque pixel de la matrice I de l'image moyennant une fenêtre 5*5???
le plot de B est bizarre elle présente une infinité de courbes entrecoupées entre elles avec des couleurs différentes est ce normal??????
0