簡體   English   中英

如何在MATLAB中的4D數組中查找鄰居?

[英]How to find neighbors in 4D array in MATLAB?

我有些困惑,不勝感激。

我已經閱讀了許多有關查找相鄰像素的文章,這對您非常有幫助:

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

但是,我很難將其應用於大小為(A)= [8 340 340 15]的4D矩陣(A)。 它代表8組3D圖像(每個15片),我想與這些3D圖像取得鄰居。 我不確定要使用哪個尺寸來計算偏移量。 這是我嘗試的代碼,但我認為它不起作用,因為偏移量應適合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);

謝謝,ziggy

不知道我是否理解您的問題,但是這種方法呢?

如果矩陣是一維的:

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

但是,如果k在邊界處,則可能會出錯。 使用maxmin可以輕松解決此問題:

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更改為k1k2 ,您可能會發現對k使用數組而不是單獨的k1k2變量效果更好,即k(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{:});

您是否考慮過使用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很有用。

這是如何使鄰居沿着第二維度的方法

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM