我有点困惑,非常感谢一些帮助。
我已阅读很多关于寻找相邻像素的帖子,这非常有帮助:
http://blogs.mathworks.com/steve/2008/02/25/neighbor-indexing-2/
然而,我在将尺寸(A)= [8 340 340 15]的4D矩阵(A)上应用时遇到了麻烦。它代表了8组3D图像(每组15个切片),我想让它们得到邻居。 我不确定使用哪个尺寸来计算偏移量。这是我试过的代码,但我认为它不起作用,因为偏移量应该适用于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);
谢谢, 齐格
答案 0 :(得分: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)
进行微小的改动(我还将k
更改为k1
和{{ 1}},您可能会发现使用k2
的数组而不是单独的k
和k1
变量效果更好,即k2
和k(1)
)
好的,现在让我们跳到4个维度:
k(2)
我知道你说你不想要一个循环,但是一个非常简短的循环只是为了重构一下并使它变得一般化:
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
答案 1 :(得分:2)
您是否考虑过使用convn
?
msk = [0 1 0; 1 0 1; 0 1 0];
msk4d = permute( msk, [3 1 2 4] ); % make it 1-3-3-1 mask
neighbors_idx = find( convn( A, msk4d, 'same' ) > 0 );
您可能会发现conndef
对于以一般方式定义基本msk
非常有用。
答案 2 :(得分:0)
以下是如何在第二维度上获得邻居
sz = size( A );
ndims = numel(sz); % number of dimensions
[d{1:ndims}] = ind2sub( sz, find( A ) );
alongD = 2; % work along this dim
np = d{alongD} + 1;
sel = np <= sz( alongD ); % discard neighbors that fall outside image boundary
nm = d{alongD} - 1;
sel = sel & nm > 0; % discard neighbors that fall outside image boundary
d = cellfun( @(x) x(sel), d, 'uni', 0 );
neighbors = cat( 1, ...
ind2sub( sz, d{1:alongD-1}, np(sel), d{alongD+1:end} ),...
ind2sub( sz, d{1:alongD-1}, nm(sel), d{alongD+1:end} ) );