Sisällysluettelo:

MatLab -keuhkojen segmentointi: 5 vaihetta
MatLab -keuhkojen segmentointi: 5 vaihetta

Video: MatLab -keuhkojen segmentointi: 5 vaihetta

Video: MatLab -keuhkojen segmentointi: 5 vaihetta
Video: RoCAD - Enkesit Tasarlama Programı - (Karayolu Projesi) 2024, Marraskuu
Anonim
MatLab -keuhkojen segmentointi
MatLab -keuhkojen segmentointi

Kirjailija: Phuc Lam, Paul Yeung, Eric Reyes

Myönnetään, että keuhkojen segmentointivirheet tuottavat vääriä tietoja sairausalueen tunnistamisesta ja voivat vaikuttaa suoraan diagnoosiprosessiin. Nykyaikaiset tietokoneavustustekniikat eivät tuottaneet tarkkoja tuloksia, kun keuhkosairaudet ovat haastavia. Nämä epänormaalit muodot voivat johtua keuhkopussin effuusioista, lujittumisista jne. Sovellettaessa keuhkojen segmentointitekniikkaa, jossa keuhkojen rajat on eristetty ympäröivästä rintakudoksesta, sovelluksemme voi tunnistaa rajat käyttäjän syöttökynnyksillä, jotta saadaan täysin muokattavat näkymät keuhkojen muodoista, Tämän MatLab-projektin tarkoituksena on luoda käyttäjäystävällinen interaktiivinen keuhkojen segmentointisovellus keuhkojen röntgenkuvien patologisten tilojen havaitsemiseksi. Tavoitteenamme on luoda tehokkaampi tapa havaita ja tunnistaa epänormaaleja keuhkoja, jotta lääkäreille ja radiologeille olisi luotettavampi tapa diagnosoida keuhkosairaudet. Käyttämällä MatLabin sovellusten suunnittelutyökalua ohjelma on suunniteltu toimimaan erityisesti rintakehän röntgen- ja tietokonetomografian (CT) skannausten kanssa, mutta se on myös testattu toimimaan MRI-skannausten kanssa.

Alla olevat ohjeet sisältävät kohinan suodatustekniikkamme (alipäästösuodatin Wiener-suodatin) sekä kuvan kynnyksen (käyttämällä harmaasävyisen kuvan voimakkuushistogrammia) ja käyttämällä morfologista gradienttia (kuvan laajentumisen ja eroosion välinen ero) tunnistaa kiinnostavan alueen. Ohjeessa selitetään sitten, kuinka integroimme kaikki elementit graafiseen käyttöliittymään (GUI).

Huomautus:

1). Tämä projekti on saanut inspiraationsa tutkimuspaperista: "Segmentation and Image Analysis of Epnormal Lungs at CT: Current Approaches, Challenges, and Future Trends". Joka löytyy täältä

2). Käytämme röntgenkuvia NIH: Clinical Centeristä. Linkki löytyy täältä

3). Sovellussuunnittelijan ohje löytyy täältä

4). Ennen koodin suorittamista: sinun on muutettava Dir -polku (rivillä 34) tiedostohakemistoksi ja kuvan tyypiksi (rivi 35) (analysoimme *.png).

Vaihe 1: Vaihe 1: Kuvan lataaminen

Vaihe 1: Kuvan lataaminen
Vaihe 1: Kuvan lataaminen

Tämä vaihe näyttää alkuperäisen kuvan harmaasävyinä. Muuta 'name_of_picture.png' kuvan nimeksi

asia selvä; clc; sulje kaikki;

%% ladataan kuvia

raw_x_ray = 'kuvan_nimi_kuva';

I = imread (raw_x_ray);

kuva (101);

imshow (I);

värikartta (harmaa);

otsikko ('Harmaasävyinen röntgen');

Vaihe 2: Vaihe 2: Kohinan suodatus ja histogrammi

Vaihe 2: Kohinan suodatus ja histogrammi
Vaihe 2: Kohinan suodatus ja histogrammi

Harmaasävyisen kuvan kynnyksen löytämiseksi katsomme histogrammista, onko eri tiloissa. Lue lisää täältä

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

kuva (102);

osakaavio (2, 1, 1);

imshow (I);

osakaavio (2, 1, 2);

imhist (I, 256);

Vaihe 3: Vaihe 3: Kynnysarvojen asettaminen

Vaihe 3: Kynnysarvojen asettaminen
Vaihe 3: Kynnysarvojen asettaminen
Vaihe 3: Kynnysarvojen asettaminen
Vaihe 3: Kynnysarvojen asettaminen

Tässä vaiheessa voit asettaa kynnyksen histogrammin mukaan. morfologinen Kaltevuus korostaa kiinnostavaa aluetta punaisella, ja toiminto visboundaries peittää kehyksen hahmotetun ja suodatetun kuvan punaisella.

Käyttämällä aluepropsia voimme tarkentaa vakausmatriiseja ja lajitella ne laskevasti. Seuraavaksi binarisoin harmaata sclae -kuvaa ja käytän morfologista gradienttimenetelmää ja mLoren Shuraskingia korostamaan kiinnostavaa aluetta (ROI). Seuraava askel on kääntää kuva niin, että keuhkojen ROI on valkoinen mustalla taustalla. Käytän showMaskAsOverlay -funktiota 2 -naamion näyttämiseen. Huomautus: koodi on saanut inspiraationsa Loren Shuresta, linkki.

Lasly, luon punaisen ääriviivan käyttämällä bwbwboundaries ja peittämällä suodatinkuvan ja rajat.

a_thresh = I> = 172; % asetti tämän kynnyksen

[labelImage, numberOfBlobs] = bwlabel (a_thresh);

rekvisiitta = regionprops (a_thresh, 'kaikki');

sortedSolidity = lajittele ([props. Solidity], 'laskeudu');

SB = lajiteltu kiinteys (1);

jos SB == 1 % SB hyväksyy vain lujuuden == 1 suodattaa luut pois

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

imshow (binaryImage); värikartta (harmaa);

SE = strel ('neliö', 3);

morfologinen gradientti = imsubtract (imdilate (binaryImage, SE), imerode (binaryImage, SE));

maski = imbinarize (morfologinen gradientti, 0,03);

SE = strel ('neliö', 2);

maski = imclose (maski, SE);

maski = imfill (maski, 'reiät');

maski = bwareafilt (maski, 2); % -alueen esitysten määrä

notMask = ~ maski;

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

showMaskAsOverlay (0,5, naamio, 'r'); % sinun on ladattava sovellus/toiminto showMaskAsOverlay

BW2 = imfill (binaryImage, 'reikiä');

uusi_kuva = BW2;

uusi_kuva (~ maski) = 0; % käänteinen tausta ja reikiä

B = rajarajat (uusi_kuva); % hyväksyy vain kaksi ulottuvuutta

kuva (104);

imshow (uusi_kuva);

pidä kiinni

visboundaries (B);

loppuun

Vaihe 4: Käyttöliittymän luominen

Nyt integroimme edellisen koodin MATLAB -sovellukseen. Avaa App Designer MATLABissa (Uusi> Sovellus). Suunnittelemme ensin käyttöliittymän napsauttamalla pitkään ja vetämällä kolmea akselia keski-työtilaan. Seuraavaksi napsautamme ja painamme-vedämme kaksi painiketta, yhden muokkauskentän (teksti), yhden muokkauskentän (numeerinen), yhden liukusäätimen ja yhden avattavan valikon. Kaksi akselia näyttää esikatselun ja analysoi kuvan, ja kolmannet akselit näyttävät esikatselukuvan "valitun" kuvan pikselien histogrammin. Muokkauskenttä (teksti) -ruutu näyttää valitun kuvan tiedostopolun ja muokkauskenttä (numeerinen) näyttää keuhkojen havaitun pikselialueen.

Vaihda nyt suunnittelunäkymästä koodinäkymään App Designerissa. Kirjoita koodiin kiinteistöjen koodi napsauttamalla punaista "Ominaisuudet" -painiketta plusmerkillä. Alusta ominaisuudet I, kynnys ja alueetToExtract kuten alla annetussa koodissa. Napsauta seuraavaksi hiiren kakkospainikkeella työtilan (komponenttiselain) oikeassa yläkulmassa olevaa painiketta ja siirry kohtaan Soittopyynnöt> Siirry… soittopyyntöön. Lisää koodi "function SelectImageButtonPushed (sovellus, tapahtuma)". Tämän koodin avulla voit valita analysoitavan kuvan tietokoneeltasi käyttämällä uigetfile -tiedostoa. Kuvan valitsemisen jälkeen akselien alle ilmestyy esikatselukuva, johon liittyy histogrammi. Napsauta sitten toista painiketta hiiren kakkospainikkeella ja toista sama menettely luodaksesi takaisinsoittotoiminnon.

Lisää koodi "function AnalyzeImageButtonPushed (sovellus, tapahtuma)" -kohdan alle. Tämä koodi suorittaa pikselien laskennan ja möykkyjen havaitsemisen esikatselukuvassa analysoi kuva -painikkeella (kumpaa klikkasit tämän koodin kohdalla). Painikkeiden ohjelmoinnin jälkeen ohjelmoimme nyt liukusäätimen ja avattavan valikon. Napsauta liukusäädintä hiiren kakkospainikkeella, luo takaisinsoittotoiminto ja lisää koodi "function FilterThresholdSliderValueChanged (sovellus, tapahtuma)" -kohdan loppuun loppuun. Tämän avulla liukusäädin voi säätää harmaan voimakkuuden kynnystä.

Luo takaisinsoittotoiminto avattavalle valikolle ja lisää koodi "function AreastoExtractDropDownValueChanged (sovellus, tapahtuma)" -kohdan alle, jotta pudotusvalikko voi muokata analysoiduissa kuva -akseleissa näkyvien läiskien määrää. Napsauta nyt jokaista kokonaisuutta komponenttiselaimessa ja muuta niiden ominaisuuksia haluamallasi tavalla, kuten muuttamalla entiteettien nimiä, poistamalla akseleita ja muuttamalla skaalausta. Vedä ja pudota suunnittelunäkymän komponenttiselaimen kokonaisuudet toimivaan ja helposti ymmärrettävään asetteluun. Sinulla on nyt MATLABissa sovellus, joka voi analysoida keuhkojen kuvia pikselialueelle!

ominaisuudet (Pääsy = yksityinen) I = ; % kuvatiedosto

kynnys = 257; %kynnys harmaan intensiteetin binaaristamiseen

regionToExtract = 2;

loppuun

toiminto SelectImageButtonPushed (sovellus, tapahtuma)

clc; Dir = 'C: / Users / danie / Downloads / images_004 / images'; %define invariate -tiedosto "etuliite"

[imageExt, polku] = uigetfile ('*. png'); %nappaa kuvan nimen muuttuva osa

imageName = [Ohjaa tiedostoep imageExt]; %ketjutettuja invariaatioita ja muuttuvia suuntauksia

app. I = imread (kuvanNimi); %luki kuvan

imshow (app. I, 'parent', app. UIAxes); %näyttää kuvan

app. FilePathEditField. Value = polku; %näyttää tiedoston polun, josta alkuperäinen kuva tuli

loppuun

toiminto AnalyzeImageButtonPushed (sovellus, tapahtuma)

originalImage = app. I;

originalImage = wiener2 (nro I, [5 5]); %pisteenpoistosuodatin

histogrammi (app. AxesHistogram, app. I, 256); %näyttää kuvan histogrammin

a_thresh = originalImage> = app.threshold; % asetti tämän kynnyksen

labelImage = bwlabel (a_thresh);

rekvisiitta = regionprops (a_thresh, 'kaikki');

sortedSolidity = lajittele ([props. Solidity], 'laskeudu');

SB = lajiteltu kiinteys (1);

jos SB == 1 % SB hyväksyy vain lujuuden == 1 suodattaa luut pois

SE = strel ('neliö', 3);

morfologinen gradientti = imsubtract (imdilate (labelImage, SE), imerode (labelImage, SE));

maski = imbinarize (morfologinen gradientti, 0,03);

SE = strel ('neliö', 2);

maski = imclose (maski, SE);

maski = imfill (maski, 'reiät');

maski = bwareafilt (maski, app.regionsToExtract);

% -alueen esitysten määrä

notMask = ~ maski;

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

BW2 = imfill (labelImage, 'reikiä');

uusi_kuva = BW2;

uusi_kuva (~ maski) = 0;

B = rajarajat (uusi_kuva); % voi hyväksyä vain kaksi ulottuvuutta (uusi_kuva, 'vanhempi', app. UIAxes2);

hold (app. UIAxes2, 'on');

visboundaries (B);

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

lungArea = bwarea (uusi_kuva);

app. PixelAreaEditField. Value = lungArea;

loppuun

loppuun

toiminto FilterThresholdSliderValueChanged (sovellus, tapahtuma)

app.threshold = app. FilterThresholdSlider. Value;

loppuun

function AreastoExtractDropDownValueChanged (sovellus, tapahtuma) stringNumber = app. AreastoExtractDropDown. Value;

app.regionsToExtract = str2double (merkkijono);

loppuun

loppuun

Suositeltava: