Легкие сегмента от 3-D скана грудной клетки

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

Подготовьте данные

Загрузите человеческие данные о компьютерной томографии грудной клетки в рабочую область. Чтобы запустить этот пример, необходимо загрузить выборочные данные с MathWorks™ с помощью Add-On Explorer. Смотрите, что Выборочные данные Установки Используют Add-On Explorer.

load chestVolume
whos
  Name        Size                     Bytes  Class    Attributes

  V         512x512x318            166723584  int16              

Преобразуйте данные о компьютерной томографии из int16 к single нормировать значения к области значений [0, 1].

V = im2single(V);

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

Сегментируйте легкие

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

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

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

Просмотрите 2D срезы с помощью imshow функция.

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

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

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

Чтобы запустить процесс сегментации, нажмите Threshold, чтобы открыть срез легкого во вкладке 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 Глобальная Пороговая опция создает соответствующую сегментацию (вызов imbinarize в следующем коде). Как со срезом XY, используйте опции в меню Refine Mask, чтобы создать полируемую сегментацию легких. В операции эрозии на вкладке Morphology задайте радиус 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)

Создайте Легкие Маски и Сегмента Seed Используя activecontour

Создайте 3-D маску seed, которую можно использовать с 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 маску seed, сегментируйте легкие в 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 размерности, который был собран от исходных метаданных файла. Метаданные не включены с данными изображения, которые вы загружаете с Add-On Explorer.

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

Смотрите также

| |