Kazalo:

MatLab Segmentacija pljuč: 5 korakov
MatLab Segmentacija pljuč: 5 korakov

Video: MatLab Segmentacija pljuč: 5 korakov

Video: MatLab Segmentacija pljuč: 5 korakov
Video: CS50 2014 – 3-я неделя 2024, November
Anonim
MatLab Segmentacija pljuč
MatLab Segmentacija pljuč

Avtor: Phuc Lam, Paul Yeung, Eric Reyes

Zavedajoč se, da bodo napake pri segmentaciji pljuč povzročile napačne informacije o prepoznavanju območja bolezni in lahko neposredno vplivajo na postopek diagnoze. Sodobne tehnike računalniške pomoči niso prinesle natančnih rezultatov, kadar so pljučne bolezni zahtevne oblike. Te nenormalne oblike lahko povzročijo plevralni izlivi, konsolidacije itd. Z uporabo tehnike segmentacije pljuč, pri kateri so meje pljuč izolirane od okoliškega prsnega tkiva, lahko naša aplikacija identificira meje z uporabniškimi vhodnimi pragovi, da omogoči popolnoma prilagodljive poglede oblike pljuč, Namen tega projekta MatLab je ustvariti uporabniku prijazno interaktivno aplikacijo za segmentacijo pljuč za odkrivanje patoloških stanj rentgenskih slik pljuč. Naš cilj je ustvariti učinkovitejši način za ponazoritev in identifikacijo nenormalnih pljuč, da bi zdravnikom in radiologom dali bolj zanesljiv način za diagnosticiranje pljučnih bolezni. Z orodjem za oblikovanje aplikacij v MatLabu je program zasnovan tako, da deluje posebej z rentgenskimi slikami prsnega koša in računalniško tomografijo (CT), vendar je preizkušen tudi za delo z MRI.

Spodnja navodila vsebujejo našo tehniko filtriranja hrupa (nizkoprepustni Wienerjev filter), pa tudi prag slike (z uporabo histograma intenzivnosti slike v sivinah) in z uporabo morfološkega gradienta (razlika med razširjenostjo in erozijo slike) do opredelite zanimivo regijo. Navodilo bo nato pojasnilo, kako vse elemente vključimo v grafični uporabniški vmesnik (GUI).

Opomba:

1). Ta projekt je navdihnjen z raziskovalnim prispevkom: "Segmentacija in analiza slike nenormalnih pljuč pri CT: trenutni pristopi, izzivi in prihodnji trendi". Ki jih najdete tukaj

2). Uporabljamo rentgenske posnetke NIH: Clinical Center. Povezavo najdete tukaj

3). Pomoč oblikovalca aplikacij najdete tukaj

4). Preden zaženete kodo: morate pot Dir (v vrstici 34) spremeniti v imenik datotek in vrsto slike (vrstica 35) (analiziramo *.png).

1. korak: 1. korak: Nalaganje slike

1. korak: Nalaganje slike
1. korak: Nalaganje slike

Ta korak vam bo pokazal izvirno sliko v sivi lestvici. Spremenite 'name_of_picture.png' v ime slike

jasno; clc; zaprite vse;

%% Nalaganje slik

raw_x_ray = 'ime_slike.png';

I = imread (raw_x_ray);

slika (101);

imshow (I);

barvni zemljevid (siv);

naslov ('Rentgen v sivinah');

2. korak: 2. korak: Filtriranje hrupa in histogram

2. korak: Filtriranje hrupa in histogram
2. korak: Filtriranje hrupa in histogram

Če želimo najti prag za sivo sliko, pogledamo histogram, da vidimo, ali obstajajo ločeni načini. Več preberite tukaj

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

slika (102);

podplet (2, 1, 1);

imshow (I);

podplet (2, 1, 2);

imhist (I, 256);

3. korak: 3. korak: določitev pragov

3. korak: Nastavitev pragov
3. korak: Nastavitev pragov
3. korak: Nastavitev pragov
3. korak: Nastavitev pragov

Ta korak vam omogoča nastavitev praga glede na histogram. morphologicalGradient bo območje, ki nas zanima, označilo z rdečo barvo, vizualne meje funkcije pa prekrivajo začrtano in filtrirano podobo pljuč v rdeči barvi.

Z uporabo regionov lahko natančno določimo niz solidnosti in jih razvrstimo po padajočem. Nato binarniziram sivo sliko sclae in uporabim metodo morfološkega gradienta in mLoren Shurasking, da poudarim zanimivo območje (ROI). Naslednji korak je obrniti sliko, tako da je ROI pljuč bel na črnem ozadju. Za prikaz 2 maske uporabljam funkcijo showMaskAsOverlay. Opomba: koda je navdihnjena od Loren Shure, povezava.

Lasly, ustvarim rdeč obris z uporabo bwbwboundaries in prikrijem sliko filtra in meje.

a_thresh = I> = 172; % nastavil ta prag

[labelImage, numberOfBlobs] = bwlabel (a_thresh);

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

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

SB = sortiranoSolidity (1);

če je SB == 1 % SB sprejme samo trdnost == 1 filtrirajte kosti

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

imshow (binaryImage); barvni zemljevid (siv);

SE = strel ('kvadrat', 3);

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

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

SE = strel ('kvadrat', 2);

maska = zaprta (maska, SE);

maska = neizpolnitev (maska, 'luknje');

mask = bwareafilt (maska, 2); % kontrolna številka prikaza območja

notMask = ~ maska;

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

showMaskAsOverlay (0,5, maska, 'r'); % morate prenesti aplikacijo/funkcijo showMaskAsOverlay

BW2 = neizpolnitev (binaryImage, 'luknje');

nova_slika = BW2;

nova_slika (~ maska) = 0; % obrniti ozadje in luknje

B = črne meje (nova_slika); % lahko sprejme samo 2 dimenziji

slika (104);

imshow (nova_slika);

počakaj

vizualne meje (B);

konec

4. korak: Ustvarite grafični vmesnik

Zdaj integriramo predhodno kodo v aplikacijo MATLAB. Odprite App Designer v MATLAB (New> App). Najprej oblikujemo vmesnik tako, da pritisnemo in držimo ter v treh osi povlečemo v osrednji delovni prostor. Nato pritisnemo in držimo dva gumba, eno polje za urejanje (besedilo), eno polje za urejanje (številčno), en drsnik in en spustni meni. Dve osi bosta prikazali predogled in analizirali sliko, tretja os pa histogram slikovnih pik za predogled "izbrane" slike. V polju za urejanje (besedilo) bo prikazana pot do izbrane slike, polje za urejanje (numerično) pa bo prikazalo zaznano območje pikslov pljuč.

Zdaj preklopite iz pogleda oblikovanja v pogled kode v App Designerju. V kodo vnesite kodo za lastnosti, tako da kliknete rdeč gumb »Lastnosti« z znakom plus. Inicializirajte lastnosti I, prag in regijeToExtract kot v spodnji kodi. Nato z desno tipko miške kliknite gumb v zgornjem desnem kotu delovnega prostora (brskalnik komponent) in pojdite iz možnosti Povratni klici> Pojdi na … povratni klic. Dodajte kodo za »funkcijo SelectImageButtonPushed (aplikacija, dogodek)«. Ta koda vam omogoča, da izberete sliko za analizo iz računalnika z uporabo datoteke uigetfile. Ko izberete sliko, se pod osi prikaže slika za predogled, skupaj s histogramom. Nato z desno tipko miške kliknite drugi gumb in ponovite isti postopek, da ustvarite funkcijo povratnega klica.

Dodajte kodo pod »funkcija AnalyzeImageButtonPushed (aplikacija, dogodek)«. Ta koda bo izvedla štetje slikovnih pik in odkrivanje blobov na sliki za predogled na gumbu za analizo slike (tisto, ki ste jo kliknili z desno tipko miške za to kodo). Po programiranju gumbov bomo zdaj programirali drsnik in spustni meni. Z desno tipko miške kliknite drsnik, ustvarite funkcijo povratnega klica in do konca dodajte kodo pod “function FilterThresholdSliderValueChanged (app, event)”. To omogoča drsniku, da prilagodi prag intenzivnosti sive barve.

Ustvarite funkcijo povratnega klica za spustni meni in dodajte kodo pod "function AreastoExtractDropDownValueChanged (app, event)", da spustnemu meniju spremenite število blobov, prikazanih na analiziranih osi slike. Zdaj kliknite vsako entiteto v brskalniku komponent in spremenite njihove lastnosti po vaših željah, na primer spremenite imena entitet, odstranite osi in spremenite obseg. Povlecite in spustite entitete brskalnika komponent v pogledu za oblikovanje v funkcionalno in enostavno razumljivo postavitev. Zdaj imate v MATLAB -u aplikacijo, ki lahko analizira slike pljuč za območje slikovnih pik!

lastnosti (Dostop = zasebno) I = ; % slikovna datoteka

prag = 257; %prag za binarno intenzivnost sive barve

regionToExtract = 2;

konec

funkcija SelectImageButtonPushed (aplikacija, dogodek)

clc; Dir = 'C: / Uporabniki / danie / Prenosi / slike_004 / slike'; %definiraj nespremenljivo "predpono" datoteke

[imageExt, pot] = uigetfile ('*. png'); %zgrabi spremenljiv del imena slike

imageName = [Dir filesep imageExt]; %združi nespremenljive in spremenljive zaporedje

app. I = imread (imageName); %prebral sliko

imshow (app. I, 'parent', app. UIAxes); %prikaže sliko

app. FilePathEditField. Value = pot; %prikaz poti datoteke, od kod je prišla izvirna slika

konec

funkcija AnalyzeImageButtonPushed (aplikacija, dogodek)

originalImage = app. I;

originalImage = wiener2 (app. I, [5 5]); %filter za odstranjevanje pik

histogram (app. AxesHistogram, app. I, 256); %prikaže histogram slike

a_thresh = originalImage> = app.threshold; % nastavil ta prag

labelImage = bwlabel (a_thresh);

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

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

SB = sortiranoSolidity (1);

če je SB == 1 % SB sprejme samo trdnost == 1 filtrirajte kosti

SE = strel ('kvadrat', 3);

morfološkiGradient = imububtract (imdilate (labelImage, SE), imerode (labelImage, SE));

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

SE = strel ('kvadrat', 2);

maska = zaprta (maska, SE);

maska = neizpolnitev (maska, 'luknje');

mask = bwareafilt (mask, app.regionsToExtract);

% kontrolna številka prikaza območja

notMask = ~ maska;

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

BW2 = neizpolnitev (labelImage, 'luknje');

nova_slika = BW2;

nova_slika (~ maska) = 0;

B = črne meje (nova_slika); % lahko sprejme samo 2 dimenziji imshow (new_image, 'parent', app. UIAxes2);

zadrži (app. UIAxes2, 'on');

vizualne meje (B);

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

lungArea = bwarea (nova_slika);

app. PixelAreaEditField. Value = lungArea;

konec

konec

funkcija FilterThresholdSliderValueChanged (aplikacija, dogodek)

app.threshold = app. FilterThresholdSlider. Value;

konec

funkcija AreastoExtractDropDownValueChanged (aplikacija, dogodek) stringNumber = app. AreastoExtractDropDown. Value;

app.regionsToExtract = str2double (stringNumber);

konec

konec

Priporočena: