В этом примере показано, как исследовать объем данных путем извлечения срезов через трехмерный набор данных МРТ с помощью imtransform
и tformarray
функций.
Этот пример использует набор данных МРТ, который поставляется с MATLAB ® и который используется в примерах справки для обоих montage
и immovie
. Загрузка mri.mat
добавляет в рабочую область две переменные: D
(128 на 128 на 1 на 27, класс uint8) и палитра оттенков серого, map
(89 на 3, класс double).
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');
The размерностей in M2
упорядочиваются следующим образом:
Размерность 1: Спереди к затылку (rostral до caudal)
Размерность 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, 'cubic')
достаточно будет применить 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: Спереди назад (rostral до caudal)
Размерность 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');