В этом примере показано, как выполнить сегментацию 3-D с помощью активных контуров (змей). Просмотреть результаты можно с помощью приложения Volume Viewer.
Загрузите данные скана грудной клетки человека в рабочую область. Чтобы запустить этот пример, необходимо загрузить выборочные данные из MathWorks™ с помощью Add-On Explorer. См. «Установка выборочных данных с помощью Add-On Explorer».
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 имеет предустановленные альфа-карты, которые предназначены для обеспечения наилучшего представления определенных типов данных. Чтобы получить лучший вид сканов грудной клетки, выберите предустановку ct-bone.
Сегментируйте легкие в данных скана с помощью метода активного контура. Активные контуры является алгоритмом роста области, который требует начальных начальных точек. Пример использует приложение 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)
.
Чтобы начать процесс сегментации, нажмите кнопку Порога, чтобы открыть срез легкого на вкладке Порога. На вкладке Порог выберите опцию Ручной порог и переместите ползунок Порог, чтобы задать пороговое значение, которое достигает хорошей сегментации легких. Щелкните Создать маску (Create Mask), чтобы принять пороговое значение и вернуть вкладку Сегментация (Segmentation).
Приложение выполняет следующий код для порога изображения.
BW = XY > 5.098000e-01;
После этой начальной сегментации легких очистите маску с помощью опций в меню «Обновить маску».
В приложении можно кликнуть каждую опцию, чтобы инвертировать изображение маски так, чтобы легкие находились в переднем плане (Инвертировать маску), удалить другие сегментированные элементы, кроме легких (Очистить границы) и заполнить отверстия внутри сегментации легкого (Заливка отверстий). Наконец, используйте опцию Morphology, чтобы сгладить ребра сегментации легких. На вкладке Morphology выберите операцию Erode Mask. После выполнения этих шагов выберите Показ 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, используйте опции меню «Уточнить маску», чтобы создать полированную сегментацию легких. В операции эрозии на вкладке 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)
Создайте 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)
. Манипулируя настройками альфа-карты в редакторе визуализации, можно получить хорошее представление только о легких.
Используйте 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