2010-08-17 1 views
1

je ne pouvais pas la dernière partie de mes recherches, donc si quelqu'un pouvait me aider je serais vraiment apprécié pour l'aide .. :)S'il vous plaît aidez-moi à tester mon hypothèse avec les éléments voisins dans la matrice

dire que ma matrice d'origine est,

X = 

    0  0  0  0  0 
    0  0 12  9  0 
    0  4  9 15  0 
    0 11 19  0  0 
    0  2  4  8  0 
    0  4  5  8  0 
    0  0  0  0  0 

et après avoir constaté la moyenne des non-zéros je vais obtenir quelque chose comme ci-dessous:

new_x = 

    0   0   0   0   0 
    0   0  **9.0000** 9.0000  0 
    0  4.0000  9.0000 **9.0000** 0 
    0 **8.3333** **8.0000**  0   0 
    0  2.0000  4.0000  8.0000  0 
    0  4.0000  5.0000  8.0000  0 
    0  0   0   0   0 

Notez que tous les éléments qui sont plus e un 10 est le 'centre' et nous voulons trouver la moyenne des non-zéros avec le rayon de dis 1 m. où 1 mètre = 1 élément éloigné du centre.

** ** signifie le centre.

Pour cette partie, je l'ai utilisé les éléments suivants (de gnovice):

X=[0 0 0 0 0; 0 0 12 9 0; 0 4 9 15 0; 0 11 19 0 0; 
    0 2 4 8 0; 0 4 5 8 0; 0 0 0 0 0]; 
kernel=[0 1 0; 1 0 1; 0 1 0]; 
sumx=conv2(X,kernel,'same'); 
nx=conv2(double(X>0),kernel,'same'); 
index=(X>10); 
new_x=X; 
new_x(index)=sumx(index)./max(nx(index),1); 

Alors ma question est que je veux comparer les éléments voisins avec son centre si elles sont égales, moins, ou plus grand. Si elle est supérieure ou égale à '1' ou bien '0'. De plus, tous les éléments extérieurs au rayon peuvent être ignorés et remplacés par '0'.

Par exemple, le 9 dans le milieu est dans le rayon de 12, 15 et 19 centres, afin de prendre le centre minimum de ceux `min [9,000, 9,000, 8,000] = 8,000. Dans ce cas, 4 ne prendra pas en considération car il ne s'appelle pas le 'centre' ainsi que [8 4 5 et 8] dans les deux dernières rangées.

Je veux quelque chose comme ci-dessous:

Test_x = 

     0   0   0   0   0 
     0   0   1   1   0 
     0   0   1   1   0 
     0   1   1   0   0 
     0   0   0   0   0 
     0   0   0   0   0 
     0   0   0   0   0 

J'ai mis cette première partie dans le forum avant et je suis vraiment apprécié pour toutes les suggestions plus tôt.

Donnez-moi quelques idées pour commencer. J'ai essayé d'utiliser une boucle mais cela n'a pas semblé fonctionner très bien. N'importe quelle fonction de MATLAB qui peut faire le travail pour moi ..

Merci beaucoup pour l'aide.

Débutant à Matlab


Je pense avoir trouvé la solution à cette question en utilisant des techniques Jonas.Nous vous remercions de l'aide Jonas et gnovie :)

X = [0 0 0 0 0; 0 0 12 9 0; 0 4 9 15 0; 0 11 19 0 0; 0 2 4 8 0; 0 4 5 8 0; 0 0 0 0 0];

kernel = [0 1 0; 1 0 1; 0 1 0];

sumx = conv2 (X, noyau, 'même');

nx = conv2 (double (X> 0), noyau, 'même');

avg_x = X;

avg_x (avg_x < 10) = 0;

indice = (avg_x> 10);

avg_x (index) = sumx (indice) ./ max (nx (indice), 1);

avg_x =

 0   0   0   0   0 
    0   0 9.0000   0   0 
    0   0   0 9.0000   0 
    0 8.3333 8.0000   0   0 
    0   0   0   0   0 
    0   0   0   0   0 
    0   0   0   0   0 

tmp_x = avg_x;

maxVal = max (avg_x (:)) + 1;

tmp_x (tmp_x == 0) = maxVal;

tmp_x = imerode (tmp_x, noyau);

Test_x = X> = tmp_x;

+1

Je ne comprends pas ce que vous essayez de faire. Pour chaque élément, prenez-vous le minimum des voisins non-zéro, puis voyez si l'élément est supérieur ou égal à cette valeur? Considérant l'élément avec la valeur 9 près du centre dans votre exemple, pourquoi ne pas prendre le minimum de '[4 9 9 8]', ce qui serait 4? – gnovice

+0

Pour la valeur 9, je ne prends pas 4 dans ma considération parce que 4 n'est pas le centre ou la moyenne des nonzeros. Le but est de comparer les voisins avec leurs centres, donc quels que soient les éléments qui sont en dehors du rayon, vous pouvez les ignorer et les remplacer par '0'. Merci encore. – Nadhris

Répondre

1

Je pense que ce que vous voulez faire est de créer un nouveau tableau basé sur new_x qui remplace tous les éléments par le minimum de ses voisins 4 connectés. Ensuite, vous pouvez comparer le nouveau tableau à new_x.

Voici une façon de le faire (nécessite la boîte à outils de traitement d'images)

tmp_x = new_x; 
maxVal = max(new_x(:))+1; 
tmp_x(tmp_x == 0) = maxVal; %# replace all the zeros in tmp_x with something large 
tmp_x = imerode(tmp_x,kernel); %# kernel is the same as in the OP 
Test_x = new_x >= tmp_x; %# put ones wherever the value is 
         %# greater or equal the neighbour's minimum 
%# only keep 1's that are next to 'centers' 
Test_x = Test_x .* imdilate(X>10,strel('disk',1)) 

Test_x = 
    0  0  0  0  0 
    0  0  1  1  0 
    0  0  1  1  0 
    0  1  1  0  0 
    0  0  1  0  0 
    0  0  0  0  0 
    0  0  0  0  0 

Notez que je reçois un plus ceux avec cette logique que vous faites.

+0

Merci pour votre aide. Cependant ce que je veux faire est de comparer les quartiers avec ses centres. Comme vous pouvez le voir, le centre aura ** **, montré dans new_x. De même, quels que soient les éléments situés en dehors du rayon du centre, vous pouvez les ignorer et les mettre à zéro. – Nadhris

+0

@Nadhris: J'ai ajouté une ligne de sorte que seuls les éléments considérés à moins d'un pas d'au moins un des centres soient considérés. De plus, si vous trouvez qu'une réponse vous est utile, pensez à l'accepter et/ou à l'augmenter. – Jonas

+0

Votre réponse est vraiment proche de ce que je cherche.Mais il ne devrait pas être 1 à (5,3) parce que la valeur 4 est inférieure au centre 8. – Nadhris

Questions connexes