Obsah:

Segmentácia pľúc MatLab: 5 krokov
Segmentácia pľúc MatLab: 5 krokov

Video: Segmentácia pľúc MatLab: 5 krokov

Video: Segmentácia pľúc MatLab: 5 krokov
Video: Генерация HDL кода из моделей MATLAB/Simulink 2024, Jún
Anonim
Segmentácia pľúc MatLab
Segmentácia pľúc MatLab

Autor: Phuc Lam, Paul Yeung, Eric Reyes

Uznávajúc, že chyby v segmentácii pľúc poskytnú nepravdivé informácie o identifikácii oblasti choroby a môžu priamo ovplyvniť proces diagnostiky. Moderné techniky počítačovej pomoci nedokázali poskytnúť presné výsledky, ak majú pľúcne choroby náročné tvary. Tieto abnormálne tvary môžu byť spôsobené pleurálnymi výpotkami, konsolidáciami atď. Použitím techniky segmentácie pľúc, v ktorej sú hranice pľúc izolované od okolitého hrudného tkaniva, dokáže naša aplikácia identifikovať hranice so vstupnými prahmi používateľa a poskytnúť tak plne prispôsobiteľné zobrazenia. tvarov pľúc, Účelom tohto projektu MatLab je vytvoriť užívateľsky prívetivú interaktívnu aplikáciu segmentácie pľúc na detekciu patologických stavov röntgenových snímok pľúc. Našim cieľom je vytvoriť účinnejší spôsob ilustrácie a identifikácie abnormálnych pľúc, aby mali lekári a rádiológovia k dispozícii spoľahlivejší spôsob diagnostiky pľúcnych chorôb. Program je vybavený nástrojom pre návrhárov aplikácií v programe MatLab a je navrhnutý tak, aby pracoval špeciálne s röntgenovými snímkami hrudníka a počítačovou tomografiou (CT), ale je testovaný aj na prácu so snímkami MRI.

Nasledujúce pokyny obsahujú našu techniku filtrovania šumu (dolnopriepustný Wienerov filter), ako aj prah obrazu (pomocou histogramu intenzity obrazu v odtieňoch sivej) a použitie morfologického gradientu (rozdiel medzi dilatáciou a eróziou obrazu) na identifikovať oblasť záujmu. Inštrukcia potom vysvetlí, ako integrujeme všetky prvky do grafického používateľského rozhrania (GUI).

Poznámka:

1). Tento projekt je inšpirovaný výskumným dokumentom: „Segmentácia a obrazová analýza abnormálnych pľúc v CT: súčasné prístupy, výzvy a budúce trendy“. Ktoré nájdete tu

2). Používame röntgenové snímky z NIH: Clinical Center. Link nájdete tu

3). Pomoc pre návrhárov aplikácií nájdete tu

4). Pred spustením kódu: musíte zmeniť cestu Dir (v riadku 34) na adresár súborov a typ obrázku (riadok 35) (analyzujeme *.png).

Krok 1: Krok 1: Načítava sa obrázok

Krok 1: Načítava sa obrázok
Krok 1: Načítava sa obrázok

Tento krok vám ukáže pôvodný obrázok v šedej škále. Zmeňte „name_of_picture.png“na názov svojho obrázka

jasný; clc; zavrieť všetky;

%% Načítavajú sa obrázky

raw_x_ray = 'name_of_picture.png';

I = imread (raw_x_ray);

figúrka (101);

imshow (I);

farebná mapa (sivá);

názov („RTG v odtieňoch sivej“);

Krok 2: Krok 2: Filtrovanie šumu a histogram

Krok 2: Filtrovanie šumu a histogram
Krok 2: Filtrovanie šumu a histogram

Aby sme našli prahovú hodnotu pre obrázok v odtieňoch šedej, pozrieme sa na histogram, aby sme zistili, či existujú odlišné režimy. Prečítajte si viac tu

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

obrázok (102);

podkres (2, 1, 1);

imshow (I);

podkres (2, 1, 2);

imhist (I, 256);

Krok 3: Krok 3: Nastavenie prahových hodnôt

Krok 3: Nastavenie prahových hodnôt
Krok 3: Nastavenie prahových hodnôt
Krok 3: Nastavenie prahových hodnôt
Krok 3: Nastavenie prahových hodnôt

Tento krok vám umožňuje nastaviť prah podľa histogramu. morfologickéGradient zvýrazní oblasť záujmu červenou farbou a funkčné visboundaries prekryjú načrtnutý a filtrovaný obraz pľúc červenou farbou.

Použitím regionprops môžeme spresniť polia tuhosti a zoradiť ich zostupne. Ďalej binarizujem obrázok sivých sclae a použijem metódu morfologického gradientu a mLoren Shurasking, aby som zvýraznil oblasť záujmu (ROI). Ďalším krokom je prevrátenie obrázku tak, aby návratnosť pľúc pľúc bola na čiernom pozadí biela. Na zobrazenie 2 masky používam funkciu showMaskAsOverlay. Poznámka: kód je inšpirovaný Loren Shure, odkaz.

Lasly, vytvorím červený obrys pomocou bwbwboundaries a zakryjem obraz filtra a hranice.

a_thresh = I> = 172; % nastavilo tento prah

[labelImage, numberOfBlobs] = bwlabel (a_thresh);

props = regionprops (a_thresh, 'all');

sortSolidity = sort ([props. Solidity], 'zostúpiť');

SB = vytriedenýSolidity (1);

ak SB == 1 % SB akceptuje iba pevnosť == 1 odfiltrujte kosti

binaryImage = imbinarize (I); obrázok (103);

imshow (binaryImage); farebná mapa (sivá);

SE = strel ('štvorec', 3);

morphologicalGradient = imsubtract (imdilate (binaryImage, SE), imerode (binaryImage, SE));

maska = imbinarizovať (morphologicalGradient, 0,03);

SE = strel ('štvorec', 2);

maska = imclose (maska, SE);

mask = imfill (maska, 'diery');

maska = bwareafilt (maska, 2); % kontrolného počtu plošných šou

notMask = ~ maska;

maska = maska | bwpropfilt (notMask, 'Area', [-Inf, 5000 - eps (5000)]);

showMaskAsOverlay (0,5, maska, 'r'); % musíte si stiahnuť aplikáciu/funkciu showMaskAsOverlay

BW2 = imfill (binaryImage, 'diery');

new_image = BW2;

new_image (~ maska) = 0; % invertného pozadia a dier

B = hranice bw (new_image); % môže akceptovať iba 2 dimenzie

obrázok (104);

imshow (new_image);

Počkaj

hranice (B);

koniec

Krok 4: Vytvorenie GUI

Teraz integrujeme predchádzajúci kód do aplikácie MATLAB. Otvorte aplikáciu App Designer v programe MATLAB (Nové> Aplikácia). Najprv navrhneme rozhranie kliknutím a podržaním a potiahnutím v troch osiach do stredového pracovného priestoru. Ďalej klikneme, podržíme a potiahneme dve tlačidlá, jedno pole na úpravu (text), jedno pole na úpravu (číselné), jeden posúvač a jednu rozbaľovaciu ponuku. Dve osi zobrazia náhľad a analyzujú obrázok a tretie osi zobrazia histogram pixelov pre „vybratý“obrázok náhľadu. V poli úprav (text) sa zobrazí cesta k súboru zvoleného obrázku a v poli úprav (číselné) sa zobrazí zistená pixelová oblasť pľúc.

Teraz v aplikácii App Designer prepnite zo zobrazenia návrhu na zobrazenie kódu. Zadajte kód vlastností pre kód kliknutím na červené tlačidlo „Vlastnosti“so znamienkom plus. Inicializujte vlastnosti I, prah a regionToExtract ako v nižšie uvedenom kóde. Potom kliknite pravým tlačidlom myši na tlačidlo v pravom hornom rohu pracovného priestoru (komponentný prehliadač) a prejdite na Spätné volania> Prejsť na … spätné volanie. Pridajte kód pre „funkciu SelectImageButtonPushed (aplikácia, udalosť)“. Tento kód vám umožňuje vybrať obrázok, ktorý sa má analyzovať, z počítača pomocou súboru uigetfile. Po výbere obrázka sa pod osami zobrazí ukážkový obrázok sprevádzaný histogramom. Potom kliknite pravým tlačidlom myši na druhé tlačidlo a zopakovaním rovnakého postupu vytvorte funkciu spätného volania.

Pridajte kód pod „funkcia AnalyzeImageButtonPushed (aplikácia, udalosť)“. Tento kód vykoná počítanie pixelov a detekciu blobov v náhľadovom obrázku po kliknutí na tlačidlo analyzovať obrázok (na ktorýkoľvek z nich ste pre tento kód klikli pravým tlačidlom myši). Po naprogramovaní tlačidiel teraz naprogramujeme posuvník a rozbaľovaciu ponuku. Kliknite pravým tlačidlom na posúvač, vytvorte funkciu spätného volania a zadajte kód pod „funkcia FilterThresholdSliderValueChanged (aplikácia, udalosť)“až do konca. To umožňuje posúvaču upravovať prahovú hodnotu intenzity šedej.

Vytvorte funkciu spätného volania pre rozbaľovaciu ponuku a zadajte kód pod „funkcia AreastoExtractDropDownValueChanged (aplikácia, udalosť)“, aby v rozbaľovacej ponuke bolo možné upraviť počet blobov zobrazených na osiach analyzovaného obrázka. Teraz kliknite na každú entitu v prehliadači súčastí a zmeňte ich vlastnosti podľa svojich predstáv, ako napríklad zmena názvov entít, odstránenie osí a zmena mierky. Pretiahnutím entít komponentového prehliadača v návrhovom zobrazení prejdete na funkčné a zrozumiteľné rozloženie. Teraz máte v MATLABe aplikáciu, ktorá dokáže analyzovať obrázky pľúc pre pixelovú oblasť!

vlastnosti (Prístup = súkromné) I = ; % súbor s obrázkom

prahová hodnota = 257; %prahovej hodnoty pre binarizáciu intenzity šedej

regionToExtract = 2;

koniec

funkcia SelectImageButtonPushed (aplikácia, udalosť)

clc; Dir = 'C: / Users / danie / Downloads / images_004 / images'; %define invariate súboru „predpona“

[imageExt, cesta] = uigetfile ('*. png'); %uchopte variabilnú časť názvu obrázku

imageName = [Dir filesep imageExt]; %zreťazených invariantných a variabilných namáhaní

app. I = imread (imageName); %prečítať obrázok

imshow (app. I, 'parent', app. UIAxes); %zobrazí obrázok

app. FilePathEditField. Value = cesta; %cesta k zobrazenému súboru, odkiaľ pochádza pôvodný obrázok

koniec

funkcia AnalyzeImageButtonPushed (aplikácia, udalosť)

originalImage = app. I;

originalImage = wiener2 (app. I, [5 5]); filter na odstránenie bodiek

histogram (app. AxesHistogram, app. I, 256); %zobrazenie histogramu obrázku

a_thresh = originalImage> = app.threshold; % nastavilo tento prah

labelImage = bwlabel (a_thresh);

props = regionprops (a_thresh, 'all');

sortSolidity = sort ([props. Solidity], 'zostúpiť');

SB = vytriedenýSolidity (1);

ak SB == 1 % SB akceptuje iba pevnosť == 1 odfiltrujte kosti

SE = strel ('štvorec', 3);

morphologicalGradient = imsubtract (imdilate (labelImage, SE), imerode (labelImage, SE));

maska = imbinarizovať (morphologicalGradient, 0,03);

SE = strel ('štvorec', 2);

maska = imclose (maska, SE);

mask = imfill (maska, 'diery');

maska = bwareafilt (maska, app.regionsToExtract);

% kontrolného počtu plošných šou

notMask = ~ maska;

maska = maska | bwpropfilt (notMask, 'Area', [-Inf, 5000 - eps (5000)]);

BW2 = imfill (labelImage, 'diery');

new_image = BW2;

new_image (~ maska) = 0;

B = hranice bw (new_image); % môže akceptovať iba 2 dimenzie imshow (new_image, 'parent', app. UIAxes2);

podržať (app. UIAxes2, 'on');

hranice (B);

sada (gca, 'YDir', 'reverz');

lungArea = bwarea (nový_obraz);

app. PixelAreaEditField. Value = lungArea;

koniec

koniec

funkcia FilterThresholdSliderValueChanged (aplikácia, udalosť)

app.threshold = app. FilterThresholdSlider. Value;

koniec

funkcia AreastoExtractDropDownValueChanged (aplikácia, udalosť) stringNumber = app. AreastoExtractDropDown. Value;

app.regionsToExtract = str2double (stringNumber);

koniec

koniec

Odporúča: