我有这段代码:
[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)
。
答案 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);