В этом примере показано, как выполнить 3-D сегментацию с помощью активных контуров (змеи). Можно просмотреть результаты с помощью приложения Volume Viewer.
Загрузите человеческие данные о компьютерной томографии грудной клетки в рабочую область. Чтобы запустить этот пример, необходимо загрузить выборочные данные с MathWorks™ с помощью Add-On Explorer. Смотрите, что Выборочные данные Установки Используют Add-On Explorer.
load chestVolume
whos
Name Size Bytes Class Attributes V1 512x512x318 166723584 int16
Преобразуйте данные о компьютерной томографии из int16
к single
нормировать значения к области значений [0, 1].
V = im2single(V1); whos
Name Size Bytes Class Attributes V 512x512x318 333447168 single V1 512x512x318 166723584 int16
Просмотрите сканирования грудной клетки с помощью приложения 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)
Создайте 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