exponenta event banner

Легкие сегмента от 3D рентгеновского обследования груди

В этом примере показано, как выполнить сегментацию 3-D с использованием активных контуров (змей). Просмотреть результаты можно с помощью приложения Volume Viewer.

Подготовка данных

Загрузите данные компьютерной томографии в рабочее пространство. Для выполнения этого примера необходимо загрузить образцы данных из MathWorks™ с помощью проводника надстроек. См. раздел Установка образцов данных с помощью проводника надстроек.

load chestVolume
whos
  Name        Size                     Bytes  Class    Attributes

  V         512x512x318            166723584  int16              

Преобразование данных сканирования CT из int16 кому single для нормализации значений в диапазоне [0, 1].

V = im2single(V);

Просмотрите результаты сканирования с помощью приложения Volume Viewer. Откройте приложение на панели инструментов MATLAB ® Apps. Вы также можете открыть приложение с помощью volumeViewer и задание тома в качестве аргумента: volumeViewer(V). В программе Volume Viewer имеются предварительно установленные alphamap, предназначенные для наилучшего просмотра определенных типов данных. Чтобы получить наилучший обзор сканирования грудной клетки, выберите предустановленную ct-кость.

Сегментация легких

Сегментируйте легкие в данных КТ с использованием метода активного контура. Активные контуры - это алгоритм выращивания области, который требует начальных начальных точек. В примере используется приложение Image Segmenter для создания этой начальной маски путем сегментирования двух ортогональных срезов 2-D, один в плоскости XY, а другой в плоскости XZ. Затем пример вставляет эти два сегмента в маску 3-D. Пример передает эту маску в activecontour функция для создания 3-D сегментации легких в грудной полости. (В этом примере используется метод активного контура, но для достижения той же цели можно использовать другие методы сегментации, например заливку заливкой.)

Извлеките центральный фрагмент в размерах XY и XZ.

XY = V(:,:,160);
XZ = squeeze(V(256,:,:));

Просмотр фрагментов 2-D с помощью imshow функция.

figure
imshow(XY,[],'Border','tight');

imshow(XZ,[],'Border','tight');

Вы можете выполнить сегментирование в приложении Image Segmenter. Откройте приложение из панели инструментов MATLAB Apps или используйте imageSegmenter команда, указывающая фрагмент 2-D в качестве аргумента, imageSegmenter(XY).

Чтобы запустить процесс сегментации, щелкните Порог (Threshold), чтобы открыть фрагмент легкого на вкладке Порог (Threshold). На вкладке Порог (Threshold) выберите параметр Порог вручную (Manual Threshold) и переместите ползунок Порог (Threshold), чтобы указать пороговое значение, обеспечивающее хорошую сегментацию легких. Щелкните Создать маску (Create Mask), чтобы принять пороговое значение и вернуть вкладку Сегментация (Segmentation).

Приложение выполняет следующий код для порогового значения изображения.

BW = XY > 5.098000e-01;

После начальной сегментации легких очистите маску с помощью опций меню Уточнить маску (Refine Mask).

В приложении можно щелкнуть каждый параметр, чтобы перевернуть изображение маски так, чтобы легкие были на переднем плане (Инверсная маска), удалить другие сегментированные элементы, кроме легких (четкие границы), и заполнить отверстия внутри сегментации легких (заполнить отверстия). Наконец, используйте опцию «Морфология» для сглаживания краев сегментации легких. На вкладке Морфология (Morphology) выберите операцию Эродировать маску (Erode Mask). После выполнения этих действий выберите Показать двоичный файл (Show Binary) и сохраните изображение маски в рабочей области.

Приложение выполняет следующий код для уточнения маски.

BW = imcomplement(BW);
BW = imclearborder(BW);
BW = imfill(BW, 'holes');
radius = 3;
decomposition = 0;
se = strel('disk',radius,decomposition);
BW = imerode(BW, se);
maskedImageXY = XY;
maskedImageXY(~BW) = 0;
imshow(maskedImageXY)

Выполните ту же операцию для XZ-среза. С помощью команды «Загрузить изображение» выберите XZ переменная. Используйте пороговое значение для выполнения начальной сегментации легких. Для XZ-среза опция Global Threshold создает адекватную сегментацию (вызов imbinarize в следующем коде). Как и в случае фрагмента XY, используйте опции меню «Уточнить маску», чтобы создать полированную сегментацию легких. В операции эрозии на вкладке «Морфология» задайте радиус 13 для удаления небольших посторонних объектов.

Чтобы сегментировать XZ-фрагмент и отполировать результат, приложение выполняет следующий код.

BW = imbinarize(XZ);
BW = imcomplement(BW);
BW = imclearborder(BW);
BW = imfill(BW,'holes');
radius = 13;
decomposition = 0;
se = strel('disk',radius,decomposition);
BW = imerode(BW, se);
maskedImageXZ = XZ;
maskedImageXZ(~BW) = 0;
imshow(maskedImageXZ)

Создание семенной маски и сегмента легких с помощью activecontour

Создайте маску начала 3-D, которую можно использовать с activecontour функция для сегментации легких.

Создайте логический 3-D том того же размера, что и входной том, и вставьте mask_XY и mask_XZ в соответствующих пространственных местоположениях.

mask = false(size(V));
mask(:,:,160) = maskedImageXY;
mask(256,:,:) = mask(256,:,:)|reshape(maskedImageXZ,[1,512,318]);

Используя эту 3-D маску семян, сегментируйте легкие в 3-D объеме с помощью метода активного контура. Эта операция может занять несколько минут. Чтобы получить сегментацию качества, используйте histeq для распределения значений вокселя по доступному диапазону.

V = histeq(V);

BW = activecontour(V,mask,100,'Chan-Vese');

segmentedImage = V.*single(BW);

Сегментированные легкие можно просмотреть в приложении Volume Viewer, выполнив команду volumeViewer(segmentedImage). Манипулируя настройками alphamap в редакторе тонирования, можно получить хорошее представление только легких.

Вычислить объем сегментированных легких

Используйте regionprops3 функции с помощью 'volume' вариант расчета объема легких.

volLungsPixels = regionprops3(logical(BW),'volume');

Укажите интервал между вокселами в измерениях x, y и z, которые были собраны из исходных метаданных файла. Метаданные не включаются в данные изображения, загружаемые из проводника надстроек.

spacingx = 0.76;
spacingy = 0.76;
spacingz = 1.26*1e-6;
unitvol = spacingx*spacingy*spacingz;

volLungs1 = volLungsPixels.Volume(1)*unitvol;
volLungs2 = volLungsPixels.Volume(2)*unitvol;
volLungsLiters = volLungs1 + volLungs2
volLungsLiters = 5.7726

См. также

| |