0

私は少し混乱しており、助けていただければ幸いです。

隣接するピクセルの検索に関する多くの投稿を読みましたが、これは非常に役立ちます。

http://blogs.mathworks.com/steve/2008/02/25/neighbor-indexing-2/

ただし、size(A)=[8 340 340 15] の 4D マトリックス (A) に適用するのに問題があります。これは、隣人を取得したい 3D 画像 (それぞれ 15 スライス) の 8 つのグループを表します。オフセットを計算するために使用するサイズがわかりません。これは私が試したコードですが、オフセットを 4 次元に適合させる必要があるため、機能していないと思いますか? どうすればループなしでそれを行うことができますか?

%A is a 4D matrix with 0 or 1 values
Aidx = find(A); 

% loop here? 
[~,M,~,~] =size(A);
neighbor_offsets = [-1, M, 1, -M]';

neighbors_idx = bsxfun(@plus, Aidx', neighbor_offsets(:));
neighbors = B(neighbors_idx);

ありがとう、ジギー

4

3 に答える 3

2

私があなたの質問を理解したかどうかはわかりませんが、この種のアプローチはどうですか:

行列が 1D の場合:

M = rand(10,1);
N = M(k-1:k+1); %//immediate neighbours of k

kただし、 が境界にある場合、これはエラーになる可能性があります。maxこれは、 とを使用して簡単に修正できますmin

N = M(max(k-1,1):min(k+1,size(M,1))

次に次元を追加しましょう:

M = rand(10,10);
N = M(max(k1-1,1):min(k1+1,size(M,1), max(k2-1,1):min(k2+1,size(M,2))

それは簡単でした。同じインデックスを繰り返してsize(M,2)、境界に使用するというマイナーな変更を行うだけでした (また、 and に変更kしました。別のand変数の代わりに配列を使用するk1と、 and がうまく機能する場合があります) 。k2kk1k2k(1)k(2)

では、4 次元にスキップしましょう。

M = rand(10,10,10,10);
N = M(max(k(1)-1,1):min(k(1)+1,size(M,1)), ...
      max(k(2)-1,1):min(k(2)+1,size(M,2)), ...
      max(k(3)-1,1):min(k(3)+1,size(M,3)), ...
      max(k(4)-1,1):min(k(4)+1,size(M,4)));  %// Also you can replace all the `size(M,i)` with `end` if you like

ループは不要だとおっしゃっていましたが、少しリファクタリングして一般化するためだけに、非常に短いループはどうでしょうか。

n=ndims(M);
ind{n} = 0;
for dim = 1:n
    ind{dim} = max(k(dim)-1,1):min(k(dim)+1,size(M,dim));
end
N = M(ind{:});
于 2014-06-23T08:14:50.963 に答える