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, Jun
Anonim
MatLab Segmentacija pluća
MatLab Segmentacija pluća

Napisali: Phuc Lam, Paul Yeung, Eric Reyes

Shvativši da će greške u segmentaciji pluća proizvesti lažne informacije o identifikaciji područja bolesti i mogu izravno utjecati na proces dijagnoze. Savremene tehnike računalne pomoći nisu dale tač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 MatLab projekta je stvoriti interaktivnu aplikaciju za segmentaciju pluća prilagođenu korisniku za otkrivanje patoloških stanja rendgenskih snimaka pluća. Naš cilj je stvoriti učinkovitiji način za ilustraciju i identifikaciju abnormalnih pluća kako bismo ljekarima i radiolozima dali pouzdaniji način dijagnosticiranja plućnih bolesti. Pomoću alata za dizajniranje aplikacija u MatLabu, program je dizajniran za rad s rendgenskim snimkama prsnog koša i računalnom tomografijom (CT), ali je također testiran za rad sa MRI skeniranjem.

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 koristeći morfološki gradijent (razlika između proširenja i erozije slike) do identifikovati region od 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". Koje se mogu pronaći ovde

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 pokretanja koda: trebate promijeniti Dir stazu (u retku 34) u direktorij datoteke i vrstu slike (red 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 originalnu sliku u sivoj ljestvici. Promijenite 'name_of_picture.png' u naziv slike

jasan; clc; zatvori sve;

%% Učitavanje slika

raw_x_ray = 'ime_slike.png';

I = imread (raw_x_ray);

broj (101);

imshow (I);

karta boja (siva);

naslov ('Rentgen sivih tonova');

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. Pročitajte više ovdje

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

broj (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 korak vam omogućuje postavljanje praga prema histogramu. morphologicalGradient će crvenom bojom označiti područje interesa, a granice granica funkcije prekrivaju ocrtanu i filtriranu sliku pluća crvenom bojom.

Koristeći regionprops, možemo precizirati nizove solidilnosti i sortirati ih u opadajućem redoslijedu. Zatim binarizujem 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 koristeći bwbwboundaries i maskirajući sliku filtra i granice.

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

[labelImage, numberOfBlobs] = bwlabel (a_thresh);

rekviziti = regionprops (a_thresh, 'sve');

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

SB = sortiranoSolidity (1);

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

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

imshow (binaryImage); karta boja (siva);

SE = strel ('kvadrat', 3);

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

maska = imbinarizirati (morfološki gradijent, 0,03);

SE = strel ('kvadrat', 2);

maska = zatvorena (maska, SE);

maska = neispunjavanje (maska, 'rupe');

maska = bwareafilt (maska, 2); % kontrolni broj prikazane površine

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;

new_image (~ mask) = 0; % obrnuti pozadinu i rupe

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

broj (104);

imshow (new_image);

Čekaj

visboundaries (B);

kraj

Korak 4: Kreiranje grafičkog sučelja

Sada integriramo prethodni kôd u aplikaciju MATLAB. Otvorite App Designer u MATLAB -u (Novo> Aplikacija). Prvo, sučelje dizajniramo tako da pritisnemo i držimo i povučemo u tri osi u središnji radni prostor. Zatim kliknemo i držimo i povučemo dva gumba, jedno polje za uređivanje (tekst), jedno polje za uređivanje (numeričko), jedan klizač i jedan padajući izbornik. Po dvije osi prikazat će pregled i analizirati sliku, a treće osi prikazat će histogram piksela za pregled odabrane slike. Polje za uređivanje (tekst) prikazat će putanju datoteke odabrane slike, a polje za uređivanje (numeričko) prikazat će otkrivenu površinu piksela pluća.

Sada se u dizajneru aplikacija prebacite s prikaza dizajna na prikaz koda. Unesite kod za svojstva klikom na crveno dugme „Svojstva“sa znakom plus. Inicijalizirajte svojstva I, prag i regijeToExtract kao u donjem kodu. Zatim desnom tipkom miša kliknite gumb u gornjem desnom dijelu 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 vam omogućava da izaberete sliku za analizu sa svog računara koristeći uigetfile. Nakon odabira slike, ispod osi će se pojaviti slika za pregled uz histogram. Zatim desnom tipkom miša kliknite drugo dugme i ponovite isti postupak za stvaranje funkcije povratnog poziva.

Dodajte kôd ispod "funkcija 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 da kliknete desnim tasterom miša za ovaj kôd). Nakon programiranja tipki, sada ćemo programirati klizač i padajući izbornik. Desnom tipkom miša kliknite klizač, stvorite funkciju povratnog poziva i dodajte kôd ispod „funkcija FilterThresholdSliderValueChanged (aplikacija, događaj)“do kraja. Ovo omogućava klizaču da podesi prag intenziteta sive boje.

Napravite funkciju povratnog poziva za padajući izbornik i dodajte kôd ispod „funkcija 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, kao što je promjena imena entiteta, uklanjanje osi i mijenjanje razmjera. 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 promenljivi deo imena 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); %prikazuje sliku

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

kraj

funkcija AnalyzeImageButtonPushed (aplikacija, događaj)

originalna slika = app. I;

originalImage = wiener2 (app. I, [5 5]); %filter za uklanjanje tačaka

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

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

labelImage = bwlabel (a_thresh);

rekviziti = regionprops (a_thresh, 'sve');

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

SB = sortiranoSolidity (1);

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

SE = strel ('kvadrat', 3);

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

maska = imbinarizirati (morfološki gradijent, 0,03);

SE = strel ('kvadrat', 2);

maska = zatvorena (maska, SE);

maska = neispunjavanje (maska, 'rupe');

mask = bwareafilt (maska, app.regionsToExtract);

% kontrolni broj prikazane površine

notMask = ~ maska;

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

BW2 = ispuna (labelImage, 'rupe');

nova_slika = BW2;

new_image (~ mask) = 0;

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

hold (app. UIAxes2, 'on');

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čuje se: