Оглавление:

Сегментация легких в MatLab: 5 шагов
Сегментация легких в MatLab: 5 шагов

Видео: Сегментация легких в MatLab: 5 шагов

Видео: Сегментация легких в MatLab: 5 шагов
Видео: Разметка данных для сегментации в MATLAB 2024, Июнь
Anonim
Сегментация легких в MatLab
Сегментация легких в MatLab

Авторы: Фук Лам, Пол Йунг, Эрик Рейес

Признание того, что ошибки сегментации легких приведут к ложной информации относительно определения области заболевания и могут напрямую повлиять на процесс диагностики. Современные вспомогательные компьютерные технологии не могут дать точных результатов, когда заболевания легких имеют сложную форму. Эти аномальные формы могут быть вызваны плевральными выпотами, уплотнениями и т. Д. Применяя технику сегментации легких, при которой границы легкого изолированы от окружающей грудной ткани, наше приложение может определять границы с помощью пороговых значений ввода пользователя, чтобы получить полностью настраиваемые представления формы легких, Целью этого проекта MatLab является создание удобного интерактивного приложения для сегментации легких для обнаружения патологических состояний на рентгеновских изображениях легких. Наша цель - создать более эффективный способ иллюстрировать и идентифицировать аномальные легкие, чтобы дать врачам и радиологам более надежный способ диагностики заболеваний легких. Используя инструмент конструктора приложений в MatLab, программа разработана специально для работы с рентгеновскими снимками грудной клетки и компьютерной томографией (КТ), но также протестирована для работы с МРТ.

Приведенные ниже инструкции содержат нашу технику фильтрации шума (низкочастотный фильтр Винера), а также пороговое значение изображения (с использованием гистограммы интенсивности изображения в градациях серого) и использование морфологического градиента (разница между расширением и эрозией изображения) для определить интересующий регион. Затем инструкция объяснит, как мы интегрируем все элементы в графический интерфейс пользователя (GUI).

Примечание:

1). Этот проект вдохновлен исследовательской работой: «Сегментация и анализ изображений аномальных легких при компьютерной томографии: современные подходы, проблемы и будущие тенденции». Что можно найти здесь

2). Мы используем рентгеновские снимки из NIH: Clinical Center. Ссылку можно найти здесь

3). Помощь дизайнера приложений можно найти здесь

4). Перед запуском кода: вам нужно изменить путь Dir (в строке 34) к каталогу вашего файла и тип изображения (строка 35) (мы анализируем *.png).

Шаг 1. Шаг 1. Загрузка изображения

Шаг 1. Загрузка изображения
Шаг 1. Загрузка изображения

Этот шаг покажет вам исходное изображение в серой шкале. Измените name_of_picture-p.webp

Чисто; clc; закрыть все;

%% Загрузка изображений

raw_x_ray = 'name_of_picture.png';

I = imread (raw_x_ray);

фигура (101);

imshow (I);

палитра (серый);

title ('Grayscale X-Ray');

Шаг 2: Шаг 2: Фильтрация шума и гистограмма

Шаг 2: Фильтрация шума и гистограмма
Шаг 2: Фильтрация шума и гистограмма

Чтобы найти порог для изображения в градациях серого, мы смотрим на гистограмму, чтобы увидеть, есть ли отдельные режимы. Подробнее читайте здесь

I = wiener2 (I, [5 5]);

фигурка (102);

подзаговор (2, 1, 1);

imshow (I);

подзаговор (2, 1, 2);

имхист (I, 256);

Шаг 3: Шаг 3: Установка пороговых значений

Шаг 3: Установка пороговых значений
Шаг 3: Установка пороговых значений
Шаг 3: Установка пороговых значений
Шаг 3: Установка пороговых значений

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

Используя regionprops, мы можем уточнять массивы устойчивости и сортировать их по убыванию. Затем я преобразовываю в двоичную форму изображение серого склепа и применяю метод морфологического градиента и млорен Шураскинг, чтобы выделить интересующую область (ROI). Следующий шаг - инвертировать изображение так, чтобы область интереса легкого была белой на черном фоне. Я использую функцию showMaskAsOverlay для отображения 2 масок. Примечание: код вдохновлен Loren Shure, ссылка.

Наконец, я создаю красный контур, используя bwbwboundaries и маскируя изображение фильтра и границы.

a_thresh = I> = 172; % установить этот порог

[labelImage, numberOfBlobs] = bwlabel (a_thresh);

props = regionprops (a_thresh, 'все');

sortedSolidity = sort ([props. Solidity], 'по убыванию');

SB = sortedSolidity (1);

если SB == 1% SB принимает только твердость == 1 отфильтровать кости

binaryImage = imbinarize (I); фигура (103);

imshow (binaryImage); палитра (серый);

SE = strel ('квадрат'; 3);

morphologicalGradient = imsubtract (imdilate (binaryImage, SE), имерод (binaryImage, SE));

маска = имбинаризовать (морфологический градиент, 0,03);

SE = strel ('квадрат'; 2);

маска = imclose (маска, SE);

маска = imfill (маска, «дыры»);

маска = bwareafilt (маска, 2); % контрольное количество площади шоу

notMask = ~ маска;

маска = маска | bwpropfilt (notMask, 'Area', [-Inf, 5000 - eps (5000)]);

showMaskAsOverlay (0,5, маска, 'r'); % вам необходимо скачать приложение / функцию showMaskAsOverlay

BW2 = imfill (binaryImage, «дыры»);

new_image = BW2;

new_image (~ маска) = 0; % инвертировать фон и дыры

B = bwboundaries (новое_изображение); % может принимать только 2 измерения

фигура (104);

imshow (новое_изображение);

Подожди

границы (B);

конец

Шаг 4: Создание графического интерфейса

Теперь мы интегрируем предыдущий код в приложение MATLAB. Откройте конструктор приложений в MATLAB (New> App). Во-первых, мы проектируем интерфейс, удерживая нажатой кнопку мыши и перетаскивая его по трем осям в центральную рабочую область. Затем мы нажимаем, удерживая, перетаскиваем две кнопки, одно поле редактирования (текст), одно поле редактирования (числовое), один ползунок и одно раскрывающееся меню. Две оси будут отображать предварительный просмотр и проанализированное изображение, а третьи оси будут отображать гистограмму пикселей для предварительного просмотра «выбранного» изображения. Поле редактирования (текстовое) будет отображать путь к файлу выбранного изображения, а поле редактирования (числовое) отобразит обнаруженную пиксельную область легких.

Теперь переключитесь из представления дизайна в представление кода в конструкторе приложений. Введите в код код свойств, нажав красную кнопку «Свойства» со знаком плюса рядом с ней. Инициализируйте свойства I, threshold и regionToExtract, как в приведенном ниже коде. Затем щелкните правой кнопкой мыши кнопку в верхнем правом углу рабочей области (обозреватель компонентов) и перейдите в раздел «Обратные вызовы»> «Перейти к… обратному вызову». Добавьте код для «функции SelectImageButtonPushing (приложение, событие)». Этот код позволяет вам выбрать изображение для анализа на вашем компьютере с помощью uigetfile. После выбора изображения под осями появится изображение предварительного просмотра, сопровождаемое гистограммой. Затем щелкните правой кнопкой мыши другую кнопку и повторите ту же процедуру, чтобы создать функцию обратного вызова.

Добавьте код под «функцией AnalyzeImageButtonPushing (приложение, событие)». Этот код будет выполнять подсчет пикселей и обнаружение больших двоичных объектов на изображении предварительного просмотра при нажатии кнопки анализа изображения (в зависимости от того, какую из них вы щелкнули правой кнопкой мыши для этого кода). После программирования кнопок мы теперь запрограммируем слайдер и раскрывающееся меню. Щелкните ползунок правой кнопкой мыши, создайте функцию обратного вызова и добавьте код под «function FilterThresholdSliderValueChanged (app, event)» до конца. Это позволяет ползунку регулировать пороговое значение интенсивности серого.

Создайте функцию обратного вызова для раскрывающегося меню и добавьте код под «функцией AreastoExtractDropDownValueChanged (приложение, событие)», чтобы раскрывающееся меню могло изменять количество капель, отображаемых на осях анализируемого изображения. Теперь щелкните каждый объект в обозревателе компонентов и измените их свойства по своему вкусу, например, измените имена объектов, удалите оси и измените масштабирование. Перетащите объекты обозревателя компонентов в представлении «Дизайн» в функциональный и простой для понимания макет. Теперь у вас есть приложение в MATLAB, которое может анализировать изображения легких для пиксельной области!

свойства (Доступ = частный) I = ; % файл изображения

порог = 257; % порог для бинаризации интенсивности серого

regionToExtract = 2;

конец

функция SelectImageButtonPushing (приложение, событие)

clc; Dir = 'C: / Users / danie / Downloads / images_004 / images'; % определить неизменяемый файл "префикс"

[imageExt, путь] = uigetfile ('*. png'); % захватить переменную часть имени изображения

imageName = [Dir filesep imageExt]; % конкатенации инвариантных и переменных цепочек

app. I = imread (имя_изображения); % прочтите изображение

imshow (app. I, 'parent', app. UIAxes); % отобразить изображение

app. FilePathEditField. Value = путь; % отобразить путь к файлу, откуда взято исходное изображение

конец

функция AnalyzeImageButtonPushing (приложение, событие)

originalImage = app. I;

originalImage = wiener2 (приложение I, [5 5]); % фильтр удаления точек

гистограмма (приложение AxesHistogram, приложение I, 256); % отображать гистограмму изображения

a_thresh = originalImage> = app.threshold; % установить этот порог

labelImage = bwlabel (a_thresh);

props = regionprops (a_thresh, 'все');

sortedSolidity = sort ([props. Solidity], 'по убыванию');

SB = sortedSolidity (1);

если SB == 1% SB принимает только твердость == 1 отфильтровать кости

SE = strel ('квадрат'; 3);

morphologicalGradient = imsubtract (imdilate (labelImage, SE), имерод (labelImage, SE));

маска = имбинаризовать (морфологический градиент, 0,03);

SE = strel ('квадрат'; 2);

маска = imclose (маска, SE);

маска = imfill (маска, «дыры»);

маска = bwareafilt (маска, app.regionsToExtract);

% контрольное количество площади шоу

notMask = ~ маска;

маска = маска | bwpropfilt (notMask, 'Area', [-Inf, 5000 - eps (5000)]);

BW2 = imfill (labelImage, 'дыры');

new_image = BW2;

new_image (~ маска) = 0;

B = bwboundaries (новое_изображение); % может принимать только 2 измерения imshow (new_image, 'parent', app. UIAxes2);

удерживать (app. UIAxes2, 'on');

границы (B);

set (gca, 'YDir', 'обратный');

LungArea = bwarea (новое_изображение);

app. PixelAreaEditField. Value = lightArea;

конец

конец

функция FilterThresholdSliderValueChanged (приложение, событие)

app.threshold = app. FilterThresholdSlider. Value;

конец

функция AreastoExtractDropDownValueChanged (приложение, событие) stringNumber = app. AreastoExtractDropDown. Value;

app.regionsToExtract = str2double (stringNumber);

конец

конец

Рекомендуемые: