В этом примере показано, как исследовать объем данных путем извлечения срезов через 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');