У меня есть 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
Я хочу создать график, описывающий смежность между этими регионами. В приведенном выше случае это будет:
0 1 0 1
A = 1 0 1 1
0 1 0 1
1 1 1 0
Я ищу быстрое решение для больших 3D-изображений в MATLAB. Я придумал решение, которое выполняет итерацию по всем регионам, что занимает 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
imdilate
— это узкое место, которого я хотел бы избежать.
Спасибо за помощь!