我有一个线性索引数组,对于每个线性索引,我想在半径为5-pixels
的半径中找到相邻像素的线性索引。我找到了以下代码来完成8-connected neighborhood
的工作。但是,如何实现它以查找120 neighbors
邻域的5-pixel
的线性索引。
%# target_array: array where pixels are marked
%# idx: linear index of a marked pixel
[M,N] = size(target_array)
neighbor_offsets=[-M-1 -M -M+1 1 M+1 M M-1 -1];
neighbors = bsxfun(@plus, idx, neighbor_offsets);
答案 0 :(得分:1)
您提到的代码会找到像素周围的线性索引,只要该像素不太靠近目标数组的边框即可。
在您的情况下,我建议您逐个循环显示像素,find
邻域:
[M,N] = size(target_array);
SE = strel('disk',5,inf);
%# the linear indices are stored in idxList
nIndices = length(idxList);
neighbors = cell(nIndices);
for ii = 1:nIndices
idx = idxList(ii);
bw = false(M,N);
bw(idx) = true;
bw = imdilate(bw,SE);
%# mask the center
bw(idx) = false;
neighbors{ii} = find(bw);
end
如果您知道没有任何社区重叠或触摸,您可以简化上述内容:
bw = false(M,N);
bw(idxList = true;
bw = imdilate(bw,SE);
bw(idxList) = false;
cc = bwconncomp(bw);
neighbors = cc.PixelIdxList;
答案 1 :(得分:0)
您可以使用meshgrid
和sub2ind
假设一个名为T
的目标数组和索引点(m
,n
)其中[m, n] = ind2sub(size(T), ind);
[X, Y] = meshgrid(m-5:m+5, n-5:n+5);
I = sub2ind(size(T), X(:), Y(:));
但如果你担心边缘(你应该是这样),那么使用min和max,如下所示:
[M, N] = size(T);
[X, Y] = meshgrid(max(1,m-5):min(M,m+5), max(1,n-5):min(N,n+5));
I = sub2ind(size(T), X(:), Y(:));
另请注意,这将包括中心点,但通过使用sub2ind(size(T), m, n);
找到它的线性索引,可以轻松删除