找到中心像素周围半径内所有邻居的线性指数?

时间:2013-04-29 10:23:02

标签: matlab indexing computer-vision

我有一个线性索引数组,对于每个线性索引,我想在半径为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);

2 个答案:

答案 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)

您可以使用meshgridsub2ind

执行此操作

假设一个名为T的目标数组和索引点(mn)其中[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);找到它的线性索引,可以轻松删除