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
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
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
A voir également:
- Programme matlab
- Programme demarrage windows 10 - Guide
- Mettre en veille un programme - Guide
- Cette action ne peut pas être réalisée car le fichier est ouvert dans un autre programme - Guide
- Forcer la fermeture d'un programme - Guide
- Désinstaller programme windows 10 - Guide
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
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
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
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
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 :
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.
Au passage, je ne connaissais pas cette fonction.
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.
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
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.
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.
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??????
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??????
12 févr. 2009 à 19:45
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