查找屏蔽区域中邻居的索引

时间:2016-11-07 19:45:54

标签: matlab indexing

我有这段代码:

[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

现在我想查找所有索引s,使[I(s), J(s)]等于neighbor_ind中的一行。应该忽略不可能做到的邻居指数。

我怎样才能做到这一点?

编辑:这是一个小例子。

假设我们有面具

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

(它不一定是矩形)

[I, J] = find(mask == 1)会提供I = [2, 3, 2, 3]J = [2, 2, 3, 3]

现在设置i = 2, j = 2。 面具内有两个邻居,外面有两个邻居。我想知道I, J我需要去哪里寻找这些邻居。在此示例中,右邻居的解决方案为I(3), J(3),底层邻居为I(2), J(2)

1 个答案:

答案 0 :(得分:1)

您可以使用nchoosek生成邻居索引。

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);

结果:

idx_pix =

   4
   3
   2
   1

idx_neighbors =

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

因此,在您的示例(n == 4)中,第4个像素的邻居为[1 2 3]
换句话说:

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

或     R(idx_pix(1))的邻居是R(idx_neighbors(1,:))

...
...
......

注意:使用线性索引而不是行和列更有效,因此您可以使用此签名:IDX = find(mask==1);