Исследование срезов от 3-мерного набора данных MRI

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

Шаг 1: загрузите и просмотрите горизонталь MRI

Этот пример использует набор данных MRI, который идет с MATLAB®, и это используется в примерах справки для обоих montage и immovie. Загрузка mri.mat добавляют две переменные к рабочей области: D (128 128 1 27, класс uint8) и полутоновая палитра, map (89 3, класс double).

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

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

Шаг 2: извлеките стреловидный срез из горизонтальных срезов Используя imtransform

Мы можем создать midsagittal срез из данных 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

imshow(M2,map)
title('Sagittal - Raw Data')

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

Размерности в 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,'cubic')

был бы достаточен, чтобы применить T к M2 и обеспечьте хорошее разрешение при интерполяции вдоль направления от начала до конца. Однако нет никакой потребности в кубичной интерполяции в передней стороне, чтобы поддержать направление, поскольку никакая передискретизация не произойдет вдоль (выхода) размерность 2. Поэтому мы задаем передискретизацию ближайшего соседа в этой размерности с большим КПД и идентичными результатами.

R2 = makeresampler({'cubic','nearest'},'fill');
M3 = imtransform(M2,T0,R2);  
imshow(M3,map)
title('Sagittal - imtransform')

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

Шаг 3: извлеките стреловидный срез из горизонтальных срезов Используя tformarray

На этом шаге мы получаем тот же результат как шаг 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.

imshow(M4,map)
title('Sagittal - TFORMARRAY')

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

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

Мы создаем 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');
montage(S2,map)
title('Sagittal Slices')

Figure contains an axes object. The axes object 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] задает вертикаль, от одной стороны к другой, и размерности грудь-спина, соответственно. 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');
montage(C2,map)
title('Coronal Slices')

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

Для просмотра документации необходимо авторизоваться на сайте