Lis*_*isa 5 performance matlab image-processing vectorization adjacency-matrix
我有一个3D图像,分为连续区域,每个体素具有相同的值.分配给该区域的值对于该区域是唯一的,并用作标签.下面的示例图片描述了2D案例:
1 1 1 1 2 2 2
1 1 1 2 2 2 3
Im = 1 4 1 2 2 3 3
4 4 4 4 3 3 3
4 4 4 4 3 3 3
Run Code Online (Sandbox Code Playgroud)
我想创建一个描述这些区域之间的相互关系的图表.在上面的例子中,这将是:
0 1 0 1
A = 1 0 1 1
0 1 0 1
1 1 1 0
Run Code Online (Sandbox Code Playgroud)
我正在寻找一个快速的解决方案来在MATLAB中为大型3D图像执行此操作.我提出了一个迭代所有区域的解决方案,这需要0.05s每次迭代 - 不幸的是,对于具有32'000个区域的图像,这将花费半个多小时.现在有人有更优雅的方式吗?我发布了下面的当前算法:
labels = unique(Im); % assuming labels go continuously from 1 to N
A = zeros(labels);
for ii=labels
% border mask to find neighbourhood
dil = imdilate( Im==ii, ones(3,3,3) );
border = dil - (Im==ii);
neighLabels = unique( Im(border>0) );
A(ii,neighLabels) = 1;
end
Run Code Online (Sandbox Code Playgroud)
imdilate 是我想避免的瓶颈.
谢谢您的帮助!
我想出了一个解决方案,它结合了Divakar和teng的答案以及我自己的修改,并将其推广到 2D 或 3D 情况。
为了提高效率,我可能应该预先分配 and r,c但与此同时,这是运行时:
117x159x126320000.79s0.004671s用这个解,0.002136s用Divakar解,0.03995s用teng解。不过,我还没有尝试将获胜者 (Divakar) 扩展到 3D 案例!
noDims = length(size(Im));
validim = ones(size(Im))>0;
labels = unique(Im);
if noDims == 3
Im = padarray(Im,[1 1 1],'replicate', 'post');
shifts = {[-1 0 0] [0 -1 0] [0 0 -1]};
elseif noDims == 2
Im = padarray(Im,[1 1],'replicate', 'post');
shifts = {[-1 0] [0 -1]};
end
% get value of the neighbors for each pixel
% by shifting the image in each direction
r=[]; c=[];
for i = 1:numel(shifts)
tmp = circshift(Im,shifts{i});
r = [r ; Im(validim)];
c = [c ; tmp(validim)];
end
A = sparse(r,c,ones(size(r)), numel(labels), numel(labels) );
% make symmetric, delete diagonal
A = (A+A')>0;
A(1:size(A,1)+1:end)=0;
Run Code Online (Sandbox Code Playgroud)
谢谢您的帮助!