Sadržaj:

MatLab Segmentacija pluća: 5 koraka
MatLab Segmentacija pluća: 5 koraka

Video: MatLab Segmentacija pluća: 5 koraka

Video: MatLab Segmentacija pluća: 5 koraka
Video: Разметка данных для сегментации в MATLAB 2024, Lipanj
Anonim
MatLab Segmentacija pluća
MatLab Segmentacija pluća

Napisali: Phuc Lam, Paul Yeung, Eric Reyes

Shvaćajući da će pogreške u segmentaciji pluća proizvesti lažne informacije o identifikaciji područja bolesti i mogu izravno utjecati na proces dijagnoze. Suvremene tehnike računalne pomoći nisu dale točne rezultate kada plućne bolesti imaju izazovan oblik. Ovi abnormalni oblici mogu biti uzrokovani pleuralnim izljevima, konsolidacijama itd. Primjenom tehnike segmentacije pluća, u kojoj su granice pluća izolirane od okolnog torakalnog tkiva, naša aplikacija može identificirati granice s korisničkim ulaznim pragovima kako bi se dobili potpuno prilagodljivi prikazi oblika pluća, Svrha ovog projekta MatLab je stvoriti interaktivnu aplikaciju za segmentaciju pluća prilagođenu korisniku za otkrivanje patoloških stanja rendgenskih snimaka pluća. Naš je cilj stvoriti učinkovitiji način za ilustraciju i identifikaciju abnormalnih pluća kako bismo liječnicima i radiolozima dali pouzdaniji način dijagnosticiranja plućnih bolesti. Pomoću alata za dizajner aplikacija u MatLabu, program je osmišljen za rad s rendgenskim snimkama prsnog koša i računalnom tomografijom (CT), ali je također testiran za rad s MRI snimkama.

Upute u nastavku sadrže našu tehniku filtriranja šuma (niskopropusni Wiener filter), kao i prag slike (pomoću histograma intenziteta slike u sivim tonovima) i pomoću morfološkog gradijenta (razlika između proširenja i erozije slike) do identificirati područje interesa. Uputa će zatim objasniti kako integriramo sve elemente u grafičko korisničko sučelje (GUI).

Bilješka:

1). Ovaj projekt inspiriran je istraživačkim radom: "Segmentacija i analiza slike abnormalnih pluća na CT -u: trenutni pristupi, izazovi i budući trendovi". Što se može pronaći ovdje

2). Koristimo rendgenske snimke iz NIH: Clinical Center. Link možete pronaći ovdje

3). Pomoć dizajnera aplikacija možete pronaći ovdje

4). Prije izvođenja koda: trebate promijeniti Dir stazu (u retku 34) u svoj imenik datoteka i vrstu slike (redak 35) (analiziramo *.png).

Korak 1: Korak 1: Učitavanje slike

Korak 1: Učitavanje slike
Korak 1: Učitavanje slike

Ovaj korak će vam pokazati izvornu sliku u sivoj ljestvici. Promijenite 'name_of_picture.png' u naziv svoje slike

čisto; clc; zatvori sve;

%% Učitavanje slika

raw_x_ray = 'naziv_slike.png';

I = imread (sirovi_x_ray);

slika (101);

imshow (I);

karta boja (siva);

naslov ('Rentgen u sivim tonovima');

Korak 2: Korak 2: Filtriranje šuma i histogram

Korak 2: Filtriranje šuma i histogram
Korak 2: Filtriranje šuma i histogram

Kako bismo pronašli prag za sliku sive ljestvice, gledamo histogram kako bismo vidjeli postoje li različiti načini. Više pročitajte ovdje

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

slika (102);

podcrt (2, 1, 1);

imshow (I);

podcrt (2, 1, 2);

imhist (I, 256);

Korak 3: Korak 3: Postavljanje pragova

Korak 3: Postavljanje pragova
Korak 3: Postavljanje pragova
Korak 3: Postavljanje pragova
Korak 3: Postavljanje pragova

Ovaj vam korak omogućuje postavljanje praga prema histogramu. morphologicalGradient istaknut će područje od interesa crvenom bojom, a granice granica funkcije prekrivaju ocrtanu i filtriranu sliku pluća crvenom bojom.

Korištenjem regionovca možemo točno odrediti niz solidnosti i sortirati ih prema dolje. Zatim binarniziram sivu sclae sliku i primjenjujem metodu morfološkog gradijenta i mLoren Shurasking da istaknem područje od interesa (ROI). Sljedeći korak je obrnuti sliku tako da je ROI pluća bijel na crnoj pozadini. Koristim funkciju showMaskAsOverlay za prikaz 2 maske. Napomena: kôd je inspiriran Loren Shure, veza.

Lalyly, stvaram crveni obris pomoću bwbwboundaries i maskiranja slike filtra i granica.

a_thresh = I> = 172; % postavilo je ovaj prag

[labelImage, numberOfBlobs] = bwlabel (a_thresh);

rekviziti = regijski rekviziti (a_thresh, 'sve');

sortSolidity = sort ([rekviziti. Solidity], 'silazni');

SB = sortiranoSolidity (1);

ako je SB == 1 % SB prihvaća samo čvrstoću == 1 filtrirajte kosti

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

imshow (binaryImage); karta boja (siva);

SE = strel ('kvadrat', 3);

morfološkiGradient = imisubtract (imdilat (binaryImage, SE), imerode (binaryImage, SE));

maska = imbinarizirati (morfološkiGradient, 0,03);

SE = strel ('kvadrat', 2);

maska = zatvorena (maska, SE);

maska = neispunjavanje (maska, 'rupe');

maska = bwareafilt (maska, 2); % kontrolni broj prikaza područja

notMask = ~ maska;

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

showMaskAsOverlay (0,5, maska, 'r'); % morate preuzeti aplikaciju/funkciju showMaskAsOverlay

BW2 = ispuna (binaryImage, 'rupe');

nova_slika = BW2;

nova_slika (~ maska) = 0; % obrnuti pozadinu i rupe

B = granične granice (nova_slika); % može prihvatiti samo 2 dimenzije

slika (104);

imshow (nova_slika);

drži se

visboundaries (B);

kraj

Korak 4: Stvaranje GUI -ja

Sada integriramo prethodni kôd u aplikaciju MATLAB. Otvorite App Designer u MATLAB -u (Novo> Aplikacija). Prvo, sučelje dizajniramo pritiskom i držanjem te povlačenjem u tri osi u središnji radni prostor. Zatim kliknite, držite i povucite dva gumba, jedno polje za uređivanje (tekst), jedno polje za uređivanje (numeričko), jedan klizač i jedan padajući izbornik. Dvije osi prikazat će pregled i analizirati sliku, a treće osi prikazat će histogram piksela za pregled odabrane slike. Okvir za polje za uređivanje (tekst) prikazat će putanju datoteke odabrane slike, a polje za uređivanje (numeričko) prikazat će otkriveno područje piksela pluća.

Sada prijeđite s prikaza dizajna na prikaz koda u App Designeru. Unesite kôd za svojstva klikom na crveni gumb "Svojstva" sa znakom plus. Inicijalizirajte svojstva I, prag i regijeToExtract kao u donjem kodu. Zatim desnom tipkom miša kliknite gumb u gornjem desnom kutu radnog prostora (preglednik komponenti) i idite iz Povratni pozivi> Idi na … povratni poziv. Dodajte kôd za "funkciju SelectImageButtonPushed (aplikacija, događaj)". Ovaj kôd omogućuje odabir slike za analizu s vašeg računala pomoću uigetfile. Nakon odabira slike, ispod osi će se pojaviti slika za pregled uz histogram. Zatim desnom tipkom miša kliknite drugi gumb i ponovite isti postupak za stvaranje funkcije povratnog poziva.

Dodajte kôd ispod "function AnalyzeImageButtonPushed (aplikacija, događaj)". Ovaj kôd će izvršiti prebrojavanje piksela i otkrivanje mrlja na slici za pregled nakon gumba za analizu slike (koji god kliknuli desnom tipkom miša za ovaj kôd). Nakon programiranja gumba, sada ćemo programirati klizač i padajući izbornik. Desnom tipkom miša kliknite klizač, stvorite funkciju povratnog poziva i dodajte kôd ispod "funkcije FilterThresholdSliderValueChanged (aplikacija, događaj)" do kraja. To omogućuje klizaču podešavanje praga intenziteta sive boje.

Izradite funkciju povratnog poziva za padajući izbornik i dodajte kôd ispod "function AreastoExtractDropDownValueChanged (aplikacija, događaj)" kako biste omogućili padajući izbornik da promijeni broj mrlja prikazanih na analiziranim osama slike. Sada kliknite svaki entitet u pregledniku komponenti i promijenite njihova svojstva po vašoj želji, poput promjene imena entiteta, uklanjanja osi i mijenjanja skale. Povucite i ispustite entitete preglednika komponenti u prikazu dizajna na funkcionalan i lako razumljiv izgled. Sada imate aplikaciju u MATLAB -u koja može analizirati slike pluća za područje piksela!

svojstva (Pristup = privatno) I = ; % slikovna datoteka

prag = 257; %prag za binarni intenzitet sive boje

regionToExtract = 2;

kraj

funkcija SelectImageButtonPushed (aplikacija, događaj)

clc; Dir = 'C: / Korisnici / danie / Preuzimanja / slike_004 / slike'; %definirati nepromjenjivu datoteku "prefiks"

[imageExt, path] = uigetfile ('*. png'); %zgrabite varijabilni dio naziva slike

imageName = [Dir filesep imageExt]; %ulančavanja nepromjenjivih i varijabilnih nizova

app. I = imread (imageName); %je pročitalo sliku

imshow (app. I, 'parent', app. UIAxes); %prikaz slike

app. FilePathEditField. Value = put; %prikaz putanje datoteke odakle je izvorna slika

kraj

funkcija AnalyzeImageButtonPushed (aplikacija, događaj)

originalna slika = app. I;

originalna slika = wiener2 (app. I, [5 5]); %filtar za uklanjanje točaka

histogram (app. AxesHistogram, app. I, 256); %prikaz histograma slike

a_thresh = originalna slika> = app.threshold; % postavilo je ovaj prag

labelImage = bwlabel (a_thresh);

rekviziti = regijski rekviziti (a_thresh, 'sve');

sortSolidity = sort ([rekviziti. Solidity], 'silazni');

SB = sortiranoSolidity (1);

ako je SB == 1 % SB prihvaća samo čvrstoću == 1 filtrirajte kosti

SE = strel ('kvadrat', 3);

morfološkiGradient = imisubtract (imdilat (labelImage, SE), imerode (labelImage, SE));

maska = imbinarizirati (morfološkiGradient, 0,03);

SE = strel ('kvadrat', 2);

maska = zatvorena (maska, SE);

maska = neispunjavanje (maska, 'rupe');

mask = bwareafilt (mask, app.regionsToExtract);

% kontrolni broj prikaza područja

notMask = ~ maska;

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

BW2 = ispuna (labelImage, 'rupe');

nova_slika = BW2;

nova_slika (~ maska) = 0;

B = granične granice (nova_slika); % može prihvatiti samo 2 dimenzije imshow (new_image, 'parent', app. UIAxes2);

držite (app. UIAxes2, 'uključeno');

visboundaries (B);

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

lungArea = bwarea (nova_slika);

app. PixelAreaEditField. Value = lungArea;

kraj

kraj

funkcija FilterThresholdSliderValueChanged (aplikacija, događaj)

app.threshold = app. FilterThresholdSlider. Value;

kraj

funkcija AreastoExtractDropDownValueChanged (aplikacija, događaj) stringNumber = app. AreastoExtractDropDown. Value;

app.regionsToExtract = str2double (broj niza);

kraj

kraj

Preporučeni: