0

私は線形インデックスの配列を持っており、線形インデックスごとに、半径の隣接するピクセルの線形インデックスを見つけたいとします5-pixels。の仕事をする次のコードを見つけました8-connected neighborhood120 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);
4

2 に答える 2

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;
于 2013-04-29T11:40:42.280 に答える
0

あなたはそれを行うことができmeshgridますsub2ind

ターゲット配列が呼び出されT、インデックスが points( 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(:));

ただし、エッジが心配な場合は(そうあるべきです)、次のように最小値と最大値を使用します。

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

于 2013-04-29T11:42:54.820 に答える