Sisukord:

MatLabi kopsude segmenteerimine: 5 sammu
MatLabi kopsude segmenteerimine: 5 sammu

Video: MatLabi kopsude segmenteerimine: 5 sammu

Video: MatLabi kopsude segmenteerimine: 5 sammu
Video: CS50 2014 – 3-я неделя 2024, Juuni
Anonim
MatLab kopsude segmenteerimine
MatLab kopsude segmenteerimine

Autor: Phuc Lam, Paul Yeung, Eric Reyes

Tunnistades, et vead kopsude segmenteerimisel annavad valeandmeid haiguspiirkonna tuvastamise kohta ja võivad otseselt mõjutada diagnoosimisprotsessi. Kaasaegsed arvuti abitehnikad ei andnud täpseid tulemusi, kui kopsuhaigused on väljakutsuva kujuga. Need ebanormaalsed kujud võivad olla põhjustatud pleuraefusioonidest, konsolideerumistest jne. Kasutades kopsude segmenteerimise tehnikat, mille puhul kopsu piirid on eraldatud ümbritsevast rindkere koest, saab meie rakendus tuvastada piirid kasutaja sisendlävedega, et anda täielikult kohandatavaid vaateid kopsude kuju, Selle MatLabi projekti eesmärk on luua kasutajasõbralik interaktiivne kopsude segmenteerimisrakendus kopsude röntgenipiltide patoloogiliste seisundite tuvastamiseks. Meie eesmärk on luua tõhusam viis ebanormaalsete kopsude illustreerimiseks ja tuvastamiseks, et anda arstidele ja radioloogidele usaldusväärsem viis kopsuhaiguste diagnoosimiseks. Kasutades MatLabi rakenduste kujundaja tööriista, on programm loodud töötama spetsiaalselt rindkere röntgen- ja kompuutertomograafia (CT) skaneeringutega, kuid seda testitakse ka töötamiseks MRI-skaneeringutega.

Allpool olevad juhised sisaldavad meie mürafiltreerimise tehnikat (madalpäästeklaasiga Wieneri filter), samuti pildiläve (kasutades halltoonide kujutise intensiivsuse histogrammi) ja kasutades morfoloogilist gradienti (pildi laienemise ja erosiooni erinevus). leida huvipakkuv piirkond. Seejärel selgitab juhend, kuidas me kõik elemendid graafilisse kasutajaliidesesse (GUI) integreerime.

Märge:

1). See projekt on inspireeritud uurimistööst: "Ebanormaalsete kopsude segmenteerimine ja pildianalüüs CT -s: praegused lähenemisviisid, väljakutsed ja tulevikutrendid". Mis on leitav siit

2). Kasutame röntgenpilte firmalt NIH: Clinical Center. Link on leitav siit

3). Rakendusdisaineri abi leiate siit

4). Enne koodi käivitamist: peate muutma Dir tee (real 34) failikataloogiks ja pildi tüübiks (rida 35) (analüüsime *.png).

1. samm: 1. samm: pildi laadimine

Samm: pildi laadimine
Samm: pildi laadimine

See samm näitab originaalpilti halliskaalas. Muutke „name_of_picture.png” oma pildi nimeks

selge; clc; sulgege kõik;

%% piltide laadimine

raw_x_ray = 'pildi_pildi nimi.png';

I = imread (raw_x_ray);

joonis (101);

imshow (I);

värvipilt (hall);

pealkiri ('Halltoonide röntgenikiirgus');

2. samm: 2. samm: müra filtreerimine ja histogramm

Samm: müra filtreerimine ja histogramm
Samm: müra filtreerimine ja histogramm

Halli skaala pildi läve leidmiseks vaatame histogrammi, et näha, kas erinevad režiimid. Loe lähemalt siit

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

joonis (102);

alajoon (2, 1, 1);

imshow (I);

alajoon (2, 1, 2);

imhist (I, 256);

3. samm: 3. samm: künniste seadmine

3. samm: künniste seadmine
3. samm: künniste seadmine
3. samm: künniste seadmine
3. samm: künniste seadmine

See samm võimaldab määrata läve vastavalt histogrammile. morfoloogiline gradient toob punase esile huvipakkuva piirkonna ja funktsioon visboundaries katab punasega kopsu visandatud ja filtreeritud kujutise.

Kasutades regiooniprope, saame täpsuse massiivsuse massiive täpsustada ja sortida kahanevas järjekorras. Järgmisena binariseerin halli sclae kujutise ja rakendan huvipakkuva piirkonna (ROI) esiletõstmiseks morfoloogilise gradiendi meetodit ja mLoren Shuraskingi. Järgmine samm on pildi ümberpööramine nii, et kopsu ROI on mustal taustal valge. 2 maski kuvamiseks kasutan funktsiooni showMaskAsOverlay. Märkus: kood on inspireeritud Loren Shure'ist, link.

Lasly, loon punase kontuuri, kasutades bwbwboundaries ja maskeerides filtri kujutist ja piire.

a_thresh = I> = 172; % määras selle läve

[etikett, numberOfBlobs] = bwlabel (a_thresh);

rekvisiidid = regionprops (a_thresh, 'kõik');

sortedSolidity = sort ([props. Solidity], 'laskuma');

SB = sortedSolidity (1);

kui SB == 1 % SB aktsepteerib ainult tugevust == 1 filtreerige luud välja

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

imshow (binaryImage); värvipilt (hall);

SE = strel ('ruut', 3);

morfoloogiline gradient = imsubtract (imdilate (binaryImage, SE), imerode (binaryImage, SE));

mask = imbinariseerima (morfoloogiline gradient, 0,03);

SE = strel ('ruut', 2);

mask = imclose (mask, SE);

mask = imfill (mask, 'augud');

mask = bwareafilt (mask, 2); % näituse kontrollnumber

notMask = ~ mask;

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

showMaskAsOverlay (0,5, mask, 'r'); % peate alla laadima rakenduse/funktsiooni showMaskAsOverlay

BW2 = imfill (binaryImage, 'augud');

uus_pilt = BW2;

uus_pilt (~ mask) = 0; % ümberpööratud taust ja augud

B = piiri piirid (uus_pilt); % aktsepteerib ainult 2 dimensiooni

joonis (104);

imshow (uus pilt);

oota

piirid (B);

lõpp

4. samm: GUI loomine

Nüüd integreerime eelneva koodi MATLAB -i rakendusse. Avage rakenduse kujundaja rakenduses MATLAB (uus> rakendus). Esiteks kujundame liidese, hoides all ja lohistades kolme telge keset tööruumi. Järgmisena klõpsame ja hoiame all kaks nuppu, üks redigeerimisväli (tekst), üks redigeerimisväli (numbriline), üks liugur ja üks rippmenüü. Kaks telge kuvavad eelvaate ja analüüsivad pilti ning kolmandad teljed kuvavad eelvaate „valitud” pildi pikslite histogrammi. Redigeerimisvälja (teksti) kast kuvab valitud pildi failitee ja redigeerimisväli (numbriline) kopsude tuvastatud pikslite ala.

Nüüd lülitage rakenduse kujundaja kujundusvaadelt koodivaatele. Sisestage koodi kood atribuutide jaoks, klõpsates punasel nupul „Atribuudid”, millel on plussmärk. Vormindage atribuudid I, lävi ja piirkonnadToExtract nagu allpool toodud koodis. Seejärel paremklõpsake tööruumi (komponendibrauser) paremas ülanurgas olevat nuppu ja minge jaotisest Tagasihelistamised> Mine tagasi … Lisage kood „funktsiooni SelectImageButtonPushed (rakendus, sündmus)” jaoks. See kood võimaldab teil valida arvutist uigetfile abil analüüsitava pildi. Pärast pildi valimist ilmub telgede alla eelvaade koos histogrammiga. Seejärel paremklõpsake teist nuppu ja korrake sama protseduuri tagasihelistamisfunktsiooni loomiseks.

Lisage kood „funktsiooni AnalyzeImageButtonPushed (rakendus, sündmus)” alla. See kood teeb pikslite loendamise ja plekituvastuse eelvaatepildil pildi analüüsimise nupul (olenemata sellest, millisel sellel koodil paremklõpsasite). Pärast nuppude programmeerimist programmeerime nüüd liuguri ja rippmenüü. Paremklõpsake liugurit, looge tagasihelistamisfunktsioon ja lisage lõpuni kood „function FilterThresholdSliderValueChanged (rakendus, sündmus)”. See võimaldab liuguril halli intensiivsuse läve reguleerida.

Looge rippmenüü jaoks tagasihelistamisfunktsioon ja lisage koodi „function AreastoExtractDropDownValueChanged (rakendus, sündmus)” alla kood, et rippmenüü saaks muuta analüüsitud pilditelgedel kuvatavate plekide arvu. Nüüd klõpsake komponendibrauseris iga üksust ja muutke nende omadusi oma maitse järgi, näiteks muutke olemite nimesid, eemaldage telgi ja muutke skaleerimist. Lohistage disainivaates komponendibrauseri olemid funktsionaalsele ja hõlpsasti mõistetavale paigutusele. Nüüd on teil MATLABis rakendus, mis võimaldab analüüsida pikslipiirkonna kopsu pilte!

atribuudid (juurdepääs = privaatne) I = ; % pildifail

lävi = 257; %lävi halli intensiivsuse binariseerimiseks

regionalToExtract = 2;

lõpp

funktsioon SelectImageButtonPushed (rakendus, sündmus)

clc; Dir = 'C: / Users / danie / Downloads / images_004 / images'; %define muutmata faili "eesliide"

[imageExt, path] = uigetfile ('*. png'); %haarab pildi nime muutuvast osast

imageName = [Suuna failipilt imageExt]; Muutumatute ja muutuvate sidemete liitmine %

app. I = imread (pildiNimi); %loeb pilti

imshow (app. I, 'parent', app. UIAxes); %kuvab pildi

app. FilePathEditField. Value = tee; %kuvab algse pildi pärit faili faili tee

lõpp

funktsioon AnalyzeImageButtonPushed (rakendus, sündmus)

originalImage = app. I;

originalImage = viiner2 (umbes I, [5 5]); %punktide eemaldamise filter

histogramm (app. AxesHistogram, app. I, 256); %kuvab pildi histogrammi

a_thresh = originalImage> = app.threshold; % määras selle läve

labelImage = bwlabel (a_thresh);

rekvisiidid = regionprops (a_thresh, 'kõik');

sortedSolidity = sort ([props. Solidity], 'laskuma');

SB = sortedSolidity (1);

kui SB == 1 % SB aktsepteerib ainult tugevust == 1 filtreerige luud välja

SE = strel ('ruut', 3);

morfoloogiline gradient = imsubtract (imdilate (labelImage, SE), imerode (labelImage, SE));

mask = imbinariseerima (morfoloogiline gradient, 0,03);

SE = strel ('ruut', 2);

mask = imclose (mask, SE);

mask = imfill (mask, 'augud');

mask = bwareafilt (mask, app.regionsToExtract);

% näituse kontrollnumber

notMask = ~ mask;

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

BW2 = imfill (labelImage, 'augud');

uus_pilt = BW2;

uus_pilt (~ mask) = 0;

B = piiri piirid (uus_pilt); % saab kuvada ainult kahte mõõdet (uus_pilt, 'vanem', rakendus. UIAxes2);

hoidke (app. UIAxes2, 'on');

piirid (B);

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

lungArea = bwarea (uus pilt);

app. PixelAreaEditField. Value = lungArea;

lõpp

lõpp

funktsioon FilterThresholdSliderValueChanged (rakendus, sündmus)

app.threshold = app. FilterThresholdSlider. Value;

lõpp

function AreastoExtractDropDownValueChanged (rakendus, sündmus) stringNumber = app. AreastoExtractDropDown. Value;

app.regionsToExtract = str2double (stringNumber);

lõpp

lõpp

Soovitan: