2016-11-07 7 views
0

Ich habe dieses Stück Code:finden Indizes Nachbarn in maskierten Bereich

[I, J] = find(mask == 1); 

for k = 1 : numel(I) 
    i = I(k); 
    j = J(k); 

    neighbor_ind = [i, j - 1; 
        i, j + 1; 
        i - 1, j; 
        i + 1, j]; 
end 

Nun würde Ich mag alle Indizes s so finden, dass [I(s), J(s)] zu einer der Reihen in neighbor_ind gleich ist. Die Nachbarindizes, für die dies nicht möglich ist, sollten ignoriert werden.

Wie kann ich das erreichen?

EDIT: Hier ist ein kleines Beispiel.

Angenommen, wir haben die Maske

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

(es muss nicht rechteckig sein)

[I, J] = find(mask == 1)I = [2, 3, 2, 3] und J = [2, 2, 3, 3] geben.

Jetzt können wir setzen i = 2, j = 2. Es gibt zwei Nachbarn in der Maske und zwei außerhalb. Ich möchte wissen, wo in I, J ich gehen muss, um diese Nachbarn zu finden. In diesem Beispiel wäre die Lösung I(3), J(3) für den rechten Nachbarn und I(2), J(2) für den unteren Nachbarn.

+0

@beaker habe die Toolbox – aeduG

+0

Ja aber sub2ind gibt mir den linearen Index im Lochbild. Aber ich habe die Suchfunktion verwendet und ich, J sind eine Teilmenge von Indizes. – aeduG

+0

Ich verstehe nicht, was Sie versuchen zu bekommen. Kannst du ein Beispiel geben? – beaker

Antwort

1

Sie können nchoosek verwenden, um Indizes von Nachbarn zu generieren.

mask = [... 
0  0  0  0 
0  1  1  0 
0  1  1  0 
0  0  0  0]; 
[R , C] = find(mask==1); 
n = numel(R); 
idx_pix = (n:-1:1).'; 
idx_neighbors = nchoosek(1:n,n-1); 

, dass die Ergebnisse:

idx_pix = 

    4 
    3 
    2 
    1 

idx_neighbors = 

    1 2 3 
    1 2 4 
    1 3 4 
    2 3 4 

So in Ihrem Beispiel (n == 4) Nachbarn des vierten Pixels [1 2 3]
in anderen Worten sind:

neighbors of `idx_pix(1)` are `idx_neighbors(1,:)` : 4 ->> 1 2 3 
neighbors of `idx_pix(2)` are `idx_neighbors(2,:)` : 3 ->> 1 2 4 
neighbors of `idx_pix(3)` are `idx_neighbors(3,:)` : 2 ->> 1 3 4 
neighbors of `idx_pix(4)` are `idx_neighbors(4,:)` : 1 ->> 2 3 4 

oder Nachbarn von R(idx_pix(1)) sind R(idx_neighbors(1,:))

...
...
...

Anmerkung: Es ist effizienter, lineare Indizes zu verwenden, anstatt die Zeilen und Spalten, so dass Sie diese Signatur verwenden: IDX = find(mask==1); i Ja

+0

Vielen Dank für Ihre Antwort. Ich habe immer noch Ihre Antwort in meinem Code arbeiten lassen, aber ich werde Ihre Antwort für jetzt akzeptieren. Danke vielmals. – aeduG