Исследование срезов из 3-Dimensional набора данных МРТ

В этом примере показано, как исследовать объем данных путем извлечения срезов через трехмерный набор данных МРТ с помощью imtransform и tformarray функций.

Шаг 1: Загрузка и просмотр горизонтальной МРТ

Этот пример использует набор данных МРТ, который поставляется с 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');

Figure contains an axes. The axes with title Horizontal Slices contains an object of type image.

Шаг 2: Извлечение сагиттального среза из горизонтальных срезов с помощью IMTRANSFORM

Мы можем создать средний сагиттальный срез из данных МРТ, взяв подмножество 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');

Figure contains an axes. The axes with title Sagittal - Raw Data contains an object of type image.

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')

Figure contains an axes. The axes with title Sagittal - IMTRANSFORM contains an object of type image.

Шаг 3: Извлечение сагиттального среза из горизонтальных срезов с помощью TFORMARRAY

На этом этапе мы получаем тот же результат, что и на шаге 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');

Figure contains an axes. The axes with title Sagittal - TFORMARRAY contains an object of type image.

Шаг 4: Создайте и отобразите сагиттальные срезы

Мы создадим 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');

Figure contains an axes. The axes with title Sagittal Slices contains an object of type image.

Шаг 5: Создайте и отобразите корональные срезы

Построение корональных срезов почти так же, как и построение сагиттальных срезов. Меняем 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');

Figure contains an axes. The axes with title Coronal Slices contains an object of type image.