В этом примере показано, как исследовать объем данных, извлекая срезы через трехмерный набор данных МРТ с помощью imtransform и tformarray функции.
В этом примере используется набор данных МРТ, поставляемый с MATLAB ® и используемый в примерах справки для обоихmontage и immovie. Погрузка mri.mat добавляет в рабочую область две переменные: D (128 на 128 на 1 на 27, класс uint8) и палитра оттенков серого ,map (89 на 3, класс двойной).
D содержит 27 128 на 128 горизонтальных срезов из сканирования данных МРТ человеческого черепа. Значения в D диапазон от 0 до 88, поэтому карта цветов необходима для генерации фигуры с полезным визуальным диапазоном. Размерность D делает его совместимым с montage. Первые два измерения являются пространственными. Третий размер - это цветовой размер с размером 1, поскольку он индексируется на карту цветов. (size(D,3) будет 3 для последовательности изображений RGB.) Четвёртое измерение является временным (как и для любой последовательности изображения), но в данном конкретном случае оно также является пространственным. Итак, есть три пространственных измерения в D и мы можем использовать imtransform или tformarray преобразование горизонтальных срезов в сагиттальные срезы (показывающие вид со стороны головы) или корональные (фронтальные) срезы (показывающие вид спереди или сзади головы).
Пространственные размеры D упорядочены следующим образом:
Измерение 1: От передней до задней части головы (ростральная/передняя до хвостовой/задняя)
Размер 2: слева направо от головы
Размерность 4: Снизу вверх головы (уступает верхней).
Важным фактором является то, что интервалы выборки не одинаковы по трем размерам: образцы по вертикальному размеру (4) разнесены в 2,5 раза шире, чем по горизонтальным размерам.
Загрузите набор данных МРТ и просмотрите 27 горизонтальных срезов как монтаж.
load mri; montage(D,map) title('Horizontal Slices');

Мы можем построить средне-сагиттальный срез из данных МРТ, взяв подмножество D и преобразование его для учета различных интервалов выборки и пространственной ориентации размеров D.
Следующая инструкция извлекает все данные, необходимые для мидсагиттального среза.
M1 = D(:,64,:,:); size(M1)
ans = 1×4
128 1 1 27
Однако мы не можем просматривать M1 как изображение, потому что это - 128 на 1 на 1 на 27. reshape (или squeeze) может преобразовать M1 в изображение 128 на 27, которое можно просмотреть с помощью imshow.
M2 = reshape(M1,[128 27]); size(M2)
ans = 1×2
128 27
figure, imshow(M2,map);
title('Sagittal - Raw Data');
Размеры в M2 упорядочены следующим образом:
Измерение 1: От передней до задней части головы (от ростральной до каудальной)
Размерность 2: Снизу вверх головы (уступает верхней).
Мы можем получить гораздо более удовлетворяющий взгляд путем преобразования M2 изменить его ориентацию и увеличить выборку вдоль вертикальной (низшей-высшей) размерности в 2,5 раза, сделав интервал выборки равным во всех трех пространственных размерностях. Мы могли бы сделать это поэтапно, начиная с транспонирования, но следующее аффинное преобразование обеспечивает одноступенчатое преобразование и более экономичное использование памяти.
T0 = maketform('affine',[0 -2.5; 1 0; 0 0]);Верхний блок 2 на 2 матрицы перешёл в макетформу, [0 -2.5;1 0], сочетает вращение и масштабирование. После преобразования мы имеем:
Размер 1: Сверху вниз головы (выше нижней).
Измерение 2: От передней до задней части головы (от ростральной до каудальной)
Требование
imtransform (M2, T0, 'кубический')
будет достаточно для применения T кому M2 и обеспечивают хорошее разрешение при интерполяции вдоль направления сверху вниз. Однако нет необходимости в кубической интерполяции в направлении вперед-назад, так как повторная выборка не будет происходить вдоль (выходного) размера 2. Поэтому мы определяем повторную выборку ближайшего соседа в этом измерении, с большей эффективностью и идентичными результатами.
R2 = makeresampler({'cubic','nearest'},'fill');
M3 = imtransform(M2,T0,R2);
figure, imshow(M3,map);
title('Sagittal - IMTRANSFORM')
На этом этапе мы получаем тот же результат, что и на этапе 2, но используем tformarray переход от трех пространственных измерений к двум за одну операцию. Шаг 2 начинается с массива, имеющего три пространственных измерения, и заканчивается массивом, имеющим два пространственных измерения, но промежуточные двумерные изображения (M1 и M2) проложить путь для вызова imtransform который создает M3. Эти промежуточные изображения не нужны, если мы используем tformarray вместо imtransform. imtransform очень удобно для 2-D, чтобы 2-D преобразования, но tformarray поддерживает преобразования N-D в M-D, где M не обязательно равно N.
Через свои TDIMS_A аргумент, tformarray позволяет определить перестановку для входного массива. Поскольку мы хотим создать изображение с помощью:
Измерение 1: Выше нижнего (исходное измерение 4, обратное)
Измерение 2: Каудал в ростраль (исходное измерение 1)
и извлекаем только одну сагиттальную плоскость через исходную размерность 2, указываем tdims_a = [4 1 2]. Мы создаем tform через композицию, начинающуюся с аффинной трансформации 2-D T1 который масштабирует (новое) измерение 1 на коэффициент -2,5 и добавляет сдвиг 68,5, чтобы сохранить координаты массива положительными. Вторая часть композита представляет собой пользовательское преобразование T2 который извлекает 64-ю сагиттальную плоскость с помощью очень простого INVERSE_FCN.
T1 = maketform('affine',[-2.5 0; 0 1; 68.5 0]); inverseFcn = @(X,t) [X repmat(t.tdata,[size(X,1) 1])]; T2 = maketform('custom',3,2,[],inverseFcn,64); Tc = maketform('composite',T1,T2);
Обратите внимание, что T2 и Tc принять 3-D вход к 2-D входу.
Мы используем тот же подход к повторной выборке, что и раньше, но включаем третье измерение.
R3 = makeresampler({'cubic','nearest','nearest'},'fill');tformarray преобразует три пространственных измерения D на 2-D вывод за один шаг. Наше выходное изображение - 66 на 128, при этом исходные 27 плоскостей расширяются до 66 в вертикальном (низшем-верхнем) направлении.
M4 = tformarray(D,Tc,R3,[4 1 2],[1 2],[66 128],[],0);
Результат идентичен предыдущему выходу imtransform.
figure, imshow(M4,map);
title('Sagittal - TFORMARRAY');
Мы создаем массив 4-D (третий размер - это цветовой размер), который можно использовать для создания последовательности изображений, которая идет слева направо, начинает 30 плоскостей в, пропускает каждую другую плоскость и имеет в общей сложности 35 кадров. Преобразованный массив имеет:
Измерение 1: Сверху вниз (выше нижнего)
Измерение 2: Спереди назад (ростраль в каудальный)
Размер 4: слева направо.
Как и на предыдущем шаге, мы переставляем входной массив с помощью TDIMS_A = [4 1 2], снова разворот и масштабирование/повторная выборка вертикального размера. Наша аффинная трансформация та же, что и T1 выше, за исключением того, что мы добавляем третье измерение с (3,3) элементом 0,5 и (4,3) элементом -14, выбранным для отображения 30, 32,... 98 на 1, 2,..., 35. Это центрирует наши 35 кадров на среднем сагиттальном срезе.
T3 = maketform('affine',[-2.5 0 0; 0 1 0; 0 0 0.5; 68.5 0 -14]);В нашем призыве к tformarray, TSIZE_B = [66 128 35] теперь включает 35 кадров в 4-м измерении слева направо (которое является третьим измерением преобразования). Ресамплер остается прежним.
S = tformarray(D,T3,R3,[4 1 2],[1 2 4],[66 128 35],[],0);
Просмотрите сагиттальные фрагменты как монтаж (слегка дополняя массив для разделения элементов монтажа).
S2 = padarray(S,[6 0 0 0],0,'both'); figure, montage(S2,map) title('Sagittal Slices');

Построение корональных срезов почти то же самое, что и построение сагиттальных срезов. Мы меняемся TDIMS_A от [4 1 2] кому [4 2 1]. Мы создаем серию из 45 кадров, начиная с 8 плоскостей и двигаясь сзади вперед, пропуская каждый другой кадр. Размеры выходного массива упорядочиваются следующим образом:
Измерение 1: Сверху вниз (выше нижнего)
Размер 2: слева направо
Измерение 4: Назад вперед (хвостовой до рострального).
T4 = maketform('affine',[-2.5 0 0; 0 1 0; 0 0 -0.5; 68.5 0 61]);В нашем призыве к tformarray, TSIZE_B = [66 128 48] указывает вертикальные, поперечные и поперечные размеры соответственно. Ресамплер остается прежним.
C = tformarray(D,T4,R3,[4 2 1],[1 2 4],[66 128 45],[],0);
Обратите внимание, что все перестановки и откаты массива в шагах 3, 4 и 5 были обработаны как часть tformarray операция.
Просмотрите корональные фрагменты как монтаж (слегка заполняя массив для разделения элементов монтажа).
C2 = padarray(C,[6 0 0 0],0,'both'); figure, montage(C2,map) title('Coronal Slices');
