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

Мы можем создать середину стреловидного среза из данных MRI путем взятия подмножества D и преобразование его, чтобы составлять различные интервалы выборки и ориентацию в пространстве размерностей D.
Следующий оператор извлекает все данные, необходимые для midsagittal среза.
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 матрицы передал maketform, [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 очень удобно для 2D для 2D преобразований, но tformarray N-D поддержек к преобразованиям M-D, где M не должен равняться N.
Через его TDIMS_A аргумент, tformarray позволяет нам задавать сочетание для входного массива. Поскольку мы хотим создать изображение с:
Размерность 1: Выше нижнего (исходная размерность 4, инвертированный)
Размерность 2: Хвостовой к ростральному (исходная размерность 1)
и извлеките только одну стреловидную плоскость через исходную размерность 2, мы задаем tdims_a = [4 1 2]. Мы создаем tform через состав начиная с 2D аффинного преобразования 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 вход к 2D входу.
Мы используем тот же подход к передискретизации как прежде, но включаем третью размерность.
R3 = makeresampler({'cubic','nearest','nearest'},'fill');tformarray преобразовывает три пространственных размерности D к 2D выходу на одном шаге. Наше выходное изображение 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-е, слева направо размерность (который является третьим, преобразовывают размерность). resampler остается то же самое.
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] задает вертикаль, от одной стороны к другой, и размерности грудь-спина, соответственно. resampler остается то же самое.
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');
