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.
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