Turinys:

„MatLab“plaučių segmentavimas: 5 žingsniai
„MatLab“plaučių segmentavimas: 5 žingsniai

Video: „MatLab“plaučių segmentavimas: 5 žingsniai

Video: „MatLab“plaučių segmentavimas: 5 žingsniai
Video: Lung Cancer Detection Using Image Processing Techniques 2024, Birželis
Anonim
„MatLab“plaučių segmentavimas
„MatLab“plaučių segmentavimas

Autoriai: Phuc Lam, Paul Yeung, Eric Reyes

Pripažinus, kad plaučių segmentavimo klaidos sukels klaidingą informaciją apie ligos srities nustatymą ir gali tiesiogiai paveikti diagnozės procesą. Šiuolaikinės kompiuterinės pagalbos metodai nepateikė tikslių rezultatų, kai plaučių ligos yra sudėtingos formos. Šios nenormalios formos gali atsirasti dėl pleuros išsiliejimo, susiliejimo ir pan. Taikant plaučių segmentavimo metodą, kai plaučių ribos yra izoliuotos nuo aplinkinio krūtinės ląstos audinio, mūsų programa gali nustatyti ribas su vartotojo įvesties slenksčiais, kad būtų galima visiškai pritaikyti vaizdus plaučių formos, Šio „MatLab“projekto tikslas yra sukurti patogią interaktyvią plaučių segmentavimo programą, leidžiančią aptikti plaučių rentgeno vaizdų patologines sąlygas. Mūsų tikslas yra sukurti veiksmingesnį būdą parodyti ir nustatyti nenormalius plaučius, kad gydytojai ir radiologai galėtų patikimiau diagnozuoti plaučių ligas. Naudojant „MatLab“programėlių kūrimo įrankį, programa sukurta specialiai dirbti su krūtinės ląstos rentgeno ir kompiuterinės tomografijos (KT) skenavimais, tačiau ji taip pat išbandyta, ar veikia MRT.

Toliau pateiktose instrukcijose pateikiama mūsų triukšmo filtravimo technika (žemo dažnio Wiener filtras), taip pat vaizdo slenkstis (naudojant pilkos spalvos vaizdo intensyvumo histogramą) ir morfologinis gradientas (skirtumas tarp vaizdo išsiplėtimo ir erozijos) iki nustatyti dominantį regioną. Tada instrukcijoje bus paaiškinta, kaip mes integruojame visus elementus į grafinę vartotojo sąsają (GUI).

Pastaba:

1). Šį projektą įkvėpė mokslinis darbas: „Nenormalių plaučių segmentavimas ir vaizdo analizė CT: dabartiniai metodai, iššūkiai ir ateities tendencijos“. Kurį galima rasti čia

2). Mes naudojame rentgeno nuotraukas iš NIH: klinikinio centro. Nuorodą rasite čia

3). Programų kūrėjo pagalbą rasite čia

4). Prieš paleisdami kodą: turite pakeisti „Dir“kelią (34 eilutėje) į failų katalogą ir vaizdo tipą (35 eilutė) (mes analizuojame *.png).

1 veiksmas: 1 veiksmas: vaizdo įkėlimas

1 žingsnis: įkelkite vaizdą
1 žingsnis: įkelkite vaizdą

Šis žingsnis parodys originalų vaizdą pilkos spalvos skalėje. Pakeiskite „name_of_picture.png“į savo vaizdo pavadinimą

skaidrus; clc; uždaryti viską;

%% įkeliami vaizdai

raw_x_ray = 'paveikslėlio pavadinimas.png';

I = imread (raw_x_ray);

figūra (101);

imshow (I);

spalvota (pilka);

pavadinimas („Pilkų atspalvių rentgeno spinduliai“);

2 veiksmas: 2 veiksmas: triukšmo filtravimas ir histograma

2 žingsnis: Triukšmo filtravimas ir histograma
2 žingsnis: Triukšmo filtravimas ir histograma

Norėdami rasti pilkosios skalės vaizdo slenkstį, žiūrime į histogramą, kad pamatytume, ar yra skirtingų režimų. Daugiau skaitykite čia

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

paveikslas (102);

papildomas sklypas (2, 1, 1);

imshow (I);

papildomas sklypas (2, 1, 2);

imhist (I, 256);

3 žingsnis: 3 žingsnis: slenksčių nustatymas

3 žingsnis: slenksčių nustatymas
3 žingsnis: slenksčių nustatymas
3 žingsnis: slenksčių nustatymas
3 žingsnis: slenksčių nustatymas

Šis žingsnis leidžia nustatyti slenkstį pagal histogramą. morfologinisGradientas raudonai paryškins dominančią sritį, o funkcija „visboundaries“raudonai padengs kontūrinį ir filtruotą plaučių vaizdą.

Naudodami regionprops, galime patikslinti tvirtumo masyvus ir surūšiuoti juos mažėjančia tvarka. Toliau binarizuoju pilką skliauto vaizdą ir pritaikau morfologinio gradiento metodą ir mLoren Shurasking, kad paryškintumėte dominančią sritį (IG). Kitas žingsnis yra apversti vaizdą taip, kad plaučių ROI būtų balta juodame fone. Aš naudoju funkciją showMaskAsOverlay, kad būtų rodoma 2 kaukė. Pastaba: kodą įkvėpė Loren Shure, nuoroda.

Lasly, aš sukuriu raudoną kontūrą naudodamas bwbwboundaries ir užmaskuodamas filtro vaizdą bei ribas.

a_thresh = I> = 172; % nustatė šią ribą

[labelImage, numberOfBlobs] = bwlabel (a_thresh);

rekvizitai = regionprops (a_thresh, 'all');

sortedSolidity = rūšiuoti ([props. Solidity], 'nusileisti');

SB = surūšiuotas (1);

jei SB == 1 % SB priima tik tvirtumą == 1 išfiltruokite kaulus

binaryImage = imbinarize (I); paveikslas (103);

imshow (binaryImage); spalvota (pilka);

SE = strel ('kvadratas', 3);

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

kaukė = imbinarize (morfologinisGradientas, 0,03);

SE = strel ('kvadratas', 2);

kaukė = uždėti (kaukė, SE);

kaukė = imfill (kaukė, 'skylės');

kaukė = bwareafilt (kaukė, 2); % kontrolinis ploto rodymo skaičius

notMask = ~ kaukė;

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

showMaskAsOverlay (0,5, kaukė, „r“); % turite atsisiųsti programą/funkciją showMaskAsOverlay

BW2 = imfill (binaryImage, 'skylės');

new_image = BW2;

new_image (~ kaukė) = 0; % apverstas fonas ir skylės

B = ribinės ribos (naujas vaizdas); % gali priimti tik 2 matmenis

paveikslas (104);

parodyti (naujas vaizdas);

palauk

ribos (B);

galas

4 veiksmas: sukurkite GUI

Dabar mes integruojame ankstesnį kodą į MATLAB programą. Atidarykite programų kūrėją programoje MATLAB (Nauja> Programa). Pirma, mes kuriame sąsają spustelėdami ir laikydami nuspaudę bei trimis ašimis tempdami į centrinę darbo sritį. Tada spustelėkite ir laikykite nuspaudę du mygtukus, vieną redagavimo lauką (tekstą), vieną redagavimo lauką (skaitinį), vieną slankiklį ir vieną išskleidžiamąjį meniu. Kiekvienoje iš dviejų ašių bus rodoma peržiūra ir išanalizuotas vaizdas, o trečiosiose ašyse bus rodoma peržiūros „pasirinkto“vaizdo taškų histograma. Redagavimo lauko (teksto) laukelyje bus rodomas pasirinkto vaizdo failo kelias, o redagavimo lauke (skaitinis) - aptikta plaučių pikselių sritis.

Dabar perjunkite iš dizaino rodinio į kodo rodinį „App Designer“. Įveskite nuosavybės kodo kodą spustelėdami raudoną mygtuką „Ypatybės“su pliuso ženklu. Inicijuokite ypatybes I, slenkstį ir regionusToExtract, kaip nurodyta toliau pateiktame kode. Tada dešiniuoju pelės mygtuku spustelėkite mygtuką, esantį viršutiniame dešiniajame darbo srities kampe (komponentų naršyklė), ir eikite iš Skambinimas atgal> Atgal. Pridėkite kodą „funkcija SelectImageButtonPushed (programa, įvykis)“. Šis kodas leidžia iš kompiuterio pasirinkti vaizdą, kurį norite analizuoti, naudodami uigetfile. Pasirinkus vaizdą, po ašimis pasirodys peržiūros vaizdas kartu su histograma. Tada dešiniuoju pelės mygtuku spustelėkite kitą mygtuką ir pakartokite tą pačią procedūrą, kad sukurtumėte atgalinio ryšio funkciją.

Įtraukite kodą po „funkcija AnalyzeImageButtonPushed (programa, įvykis)“. Šis kodas atliks vaizdo taškų skaičiavimą ir BLOB aptikimą peržiūros vaizde, paspaudęs vaizdo analizės mygtuką (bet kurį, kurį dešiniuoju pelės klavišu spustelėjote, kad gautumėte šį kodą). Užprogramavę mygtukus, dabar užprogramuosime slankiklį ir išskleidžiamąjį meniu. Dešiniuoju pelės mygtuku spustelėkite slankiklį, sukurkite atgalinio ryšio funkciją ir iki pabaigos pridėkite kodą po „function FilterThresholdSliderValueChanged (programa, įvykis)“. Tai leidžia slankikliui reguliuoti pilkos spalvos intensyvumo slenkstį.

Išskleidžiamajame meniu sukurkite atgalinio ryšio funkciją ir pridėkite kodą po „function AreastoExtractDropDownValueChanged (programa, įvykis)“, kad išskleidžiamasis meniu galėtų pakeisti analizuojamų vaizdo ašių rodomų BLOB skaičių. Dabar komponentų naršyklėje spustelėkite kiekvieną objektą ir pakeiskite jų savybes pagal savo skonį, pvz., Pakeiskite objektų pavadinimus, pašalinkite ašis ir pakeiskite mastelį. Vilkite ir numeskite komponentų naršyklės objektus dizaino rodinyje į funkcionalų ir lengvai suprantamą išdėstymą. Dabar MATLAB turite programą, kuri gali analizuoti pikselių ploto plaučių vaizdus!

ypatybės (Prieiga = privatus) I = ; % vaizdo failas

slenkstis = 257; %slenkstis binarizuojant pilką intensyvumą

regionToExtract = 2;

galas

funkcija SelectImageButtonPushed (programa, įvykis)

clc; Dir = 'C: / Users / danie / Downloads / images_004 / images'; %define invariate failas „priešdėlis“

[imageExt, path] = uigetfile ('*. png'); %patraukite kintamą vaizdo pavadinimo dalį

imageName = [Dir filesep imageExt]; %sujungtų nekintamų ir kintamų krypčių

app. I = imread (vaizdo pavadinimas); %perskaitė vaizdą

„imshow“(programa I, „tėvas“, programa. „UIAxes“); %rodyti vaizdą

app. FilePathEditField. Value = kelias; %rodomas failo kelias, iš kurio kilo originalus vaizdas

galas

funkcija AnalyzeImageButtonPushed (programa, įvykis)

originalImage = app. I;

originalImage = wiener2 (app. I, [5 5]); %taškų šalinimo filtras

histograma (app. AxesHistogram, app. I, 256); %rodoma vaizdo histograma

a_thresh = originalImage> = app.threshold; % nustatė šią ribą

labelImage = bwlabel (a_thresh);

rekvizitai = regionprops (a_thresh, 'all');

sortedSolidity = rūšiuoti ([props. Solidity], 'nusileisti');

SB = surūšiuotas (1);

jei SB == 1 % SB priima tik tvirtumą == 1 išfiltruokite kaulus

SE = strel ('kvadratas', 3);

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

kaukė = imbinarize (morfologinisGradientas, 0,03);

SE = strel ('kvadratas', 2);

kaukė = uždėti (kaukė, SE);

kaukė = imfill (kaukė, 'skylės');

kaukė = bwareafilt (kaukė, app.regionsToExtract);

% kontrolinis ploto rodymo skaičius

notMask = ~ kaukė;

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

BW2 = imfill (labelImage, 'skylės');

new_image = BW2;

new_image (~ kaukė) = 0;

B = ribinės ribos (naujas vaizdas); % gali priimti tik 2 matmenis (nauja_paveikslėlis, 'tėvų', app. UIAxes2);

palaikykite (app. UIAxes2, 'on');

ribos (B);

rinkinys (gca, 'YDir', 'reverse');

lungArea = bwarea (new_image);

app. PixelAreaEditField. Value = lungArea;

galas

galas

funkcija FilterThresholdSliderValueChanged (programa, įvykis)

app.threshold = app. FilterThresholdSlider. Value;

galas

function AreastoExtractDropDownValueChanged (programa, įvykis) stringNumber = app. AreastoExtractDropDown. Value;

app.regionsToExtract = str2double (stringNumber);

galas

galas

Rekomenduojamas: