В Matlab я хочу построить несколько 2D-изображений (все данные в двухмерной матрице в формате I (x, y)). Я знаю, что для одного сюжета imagesc (I) можно добиться желаемого изображения. Однако теперь у меня есть несколько изображений, и я хочу поместить их в формат стека, как изображение, показанное в Примеры

2
Mr. Dream Hunter 22 Фев 2016 в 12:16

2 ответа

Лучший ответ

Как вы уже намекнули, наиболее полезная функция для вашей проблемы: slice . Вам также следует внимательно прочитать эту статью Mathworks: { {X1}}, поскольку в нем есть больше примеров того, как работать со срезом.

В вашем случае у вас есть данные для каждого из ваших фрагментов (каждое изображение - это фрагмент), вам просто нужно упаковать их вместе, чтобы Matlab интерпретировал их как объемные данные.

Поскольку вы не предоставили никаких образцов данных для работы, мне нужно создать небольшую выборку. Я буду использовать функцию Matlab flow для генерации объемных данных и извлечения из них 4 изображений (4 среза):

%% Generate sample images
[x,y,z,v] = flow; %// x,y,z and v are all of size [25x50x25]

im1 = v(:,:,5);  %// extract the slice at Z=5.  im1 size is [25x50]
im2 = v(:,:,10); %// extract the slice at Z=10. im2 size is [25x50]
im3 = v(:,:,15); %// extract the slice at Z=15. im3 size is [25x50]
im4 = v(:,:,20); %// extract the slice at Z=20. im4 size is [25x50]

hf = figure ;
subplot(221);imagesc(im1);title('Z=5');
subplot(222);imagesc(im2);title('Z=10');
subplot(223);imagesc(im3);title('Z=15');
subplot(224);imagesc(im4);title('Z=20');

%// This is just how I generated sample images, it is not part of the "answer" !

Это дает вам 4 простых изображения: введите описание изображения здесь


Теперь самое интересное. Сложите все изображения в одну матрицу, как если бы они были просто фрагментами:

M(:,:,1) = im1 ;
M(:,:,2) = im2 ;
M(:,:,3) = im3 ;
M(:,:,4) = im4 ;

Теперь у вас есть матрица M [25x50x4]. Если у вас слишком много изображений, вы можете создать цикл для их объединения .

С этого момента просто позвоните slice, чтобы получить желаемое изображение. Посмотрите документацию, чтобы изучить все возможные варианты рендеринга. Простой пример:

hf2 = figure ;
hs = slice(M,[],[],1:4) ;
shading interp
set(hs,'FaceAlpha',0.8);

Что производит: введите описание изображения здесь


Примечание: здесь используется индексирование по умолчанию, что должно быть подходящим для решения описываемой вами проблемы (просто наложение нескольких изображений). Если вы хотите, чтобы ваш объем имел реальные координаты, вы можете создать систему координат с помощью {{X0} }. Пример:

[xs,ys,zs] = ndgrid( 1:25 , 1:50 , 1:4 ) ;

Создаст сетку / систему координат размером [25x50x4]. Просто замените числа, чтобы построить нужную вам координату сетки.

9
Hoki 22 Фев 2016 в 11:34

Расположите их все в 3D-матрице. Это будет их упорядочивание так, чтобы вы получили stack(i,j,k), где stack(i,:,:) дает вам конкретное изображение, а i - номер среза. Как только это будет сделано, используйте эту библиотеку. Viewer3D в значительной степени позволяет визуализировать все в интерактивном трехмерном графическом интерфейсе пользователя, а также выполняет интерполяцию. Однако в данных между срезами должна быть положительная корреляция, иначе трехмерное изображение не будет иметь смысла.

0
rayryeng 22 Фев 2016 в 15:03