Satura rādītājs:

MatLab plaušu segmentācija: 5 soļi
MatLab plaušu segmentācija: 5 soļi

Video: MatLab plaušu segmentācija: 5 soļi

Video: MatLab plaušu segmentācija: 5 soļi
Video: Lung inflation in Science Lesson #science #teacher #biology 2024, Novembris
Anonim
MatLab plaušu segmentācija
MatLab plaušu segmentācija

Autors: Phuc Lam, Paul Yeung, Eric Reyes

Atzīstot, ka kļūdas plaušu segmentācijā sniegs nepatiesu informāciju par slimības apgabala noteikšanu un var tieši ietekmēt diagnostikas procesu. Mūsdienu datoru palīdzības metodes nesniedza precīzus rezultātus, ja plaušu slimībām ir izaicinošas formas. Šīs neparastās formas var izraisīt pleiras izsvīdumi, konsolidācijas utt. Izmantojot plaušu segmentācijas paņēmienu, kurā plaušu robežas ir izolētas no apkārtējiem krūšu kurvja audiem, mūsu lietotne var noteikt robežas ar lietotāja ievades sliekšņiem, lai iegūtu pilnībā pielāgojamus skatus plaušu formas, Šī MatLab projekta mērķis ir izveidot lietotājam draudzīgu interaktīvu plaušu segmentācijas lietotni, lai noteiktu plaušu rentgena attēlu patoloģiskos apstākļus. Mūsu mērķis ir radīt efektīvāku veidu, kā ilustrēt un identificēt patoloģiskas plaušas, lai sniegtu ārstiem un radiologiem ticamāku veidu plaušu slimību diagnosticēšanai. Izmantojot lietotņu noformētāja rīku MatLab, programma ir izstrādāta, lai darbotos īpaši ar krūšu kurvja rentgena un datortomogrāfijas (CT) skenēšanu, taču tā tiek pārbaudīta arī darbam ar MRI skenēšanu.

Turpmākajos norādījumos ir iekļauta mūsu trokšņu filtrēšanas tehnika (zemas caurlaidības Vīnera filtrs), kā arī attēla slieksnis (izmantojot pelēktoņu attēla intensitātes histogrammu) un izmantojot morfoloģisko gradientu (atšķirība starp attēla paplašināšanos un eroziju). noteikt interesējošo reģionu. Pēc tam instrukcija izskaidros, kā mēs integrējam visus elementus grafiskajā lietotāja saskarnē (GUI).

Piezīme:

1). Šo projektu iedvesmojis pētnieciskais raksts: "Nenormālu plaušu segmentācija un attēlu analīze pie CT: pašreizējās pieejas, izaicinājumi un nākotnes tendences". Ar ko var iepazīties šeit

2). Mēs izmantojam NIH: klīniskā centra rentgena attēlus. Saite atrodama šeit

3). Lietotņu dizainera palīdzību var atrast šeit

4). Pirms koda palaišanas: jums ir jāmaina Dir ceļš (34. rindā) uz jūsu failu direktoriju un attēla veidu (35. rinda) (mēs analizējam *.png).

1. darbība: 1. darbība: attēla ielāde

1. darbība: attēla ielāde
1. darbība: attēla ielāde

Šis solis parādīs sākotnējo attēlu pelēkā skalā. Mainiet “name_of_picture.png” uz sava attēla nosaukumu

skaidrs; clc; aizvērt visu;

%% tiek ielādēti attēli

raw_x_ray = 'attēla nosaukums.png';

I = imread (raw_x_ray);

attēls (101);

imshow (I);

krāsu karte (pelēka);

nosaukums ('Pelēktoņu rentgena starojums');

2. darbība: 2. darbība: trokšņa filtrēšana un histogramma

2. darbība: trokšņa filtrēšana un histogramma
2. darbība: trokšņa filtrēšana un histogramma

Lai atrastu pelēkās skalas attēla slieksni, mēs skatāmies uz histogrammu, lai noskaidrotu, vai ir atšķirīgi režīmi. Vairāk lasi šeit

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

skaitlis (102);

apakšplāksne (2, 1, 1);

imshow (I);

apakšplāksne (2, 1, 2);

imists (I, 256);

3. darbība: 3. darbība: sliekšņu iestatīšana

3. darbība: sliekšņu iestatīšana
3. darbība: sliekšņu iestatīšana
3. darbība: sliekšņu iestatīšana
3. darbība: sliekšņu iestatīšana

Šis solis ļauj iestatīt slieksni atbilstoši histogrammai. morfoloģiskais gradients iezīmēs interesējošo reģionu sarkanā krāsā, un funkcija visboundaries pārklāj ieskicēto un filtrēto plaušu attēlu sarkanā krāsā.

Izmantojot regionprops, mēs varam precizēt stabilitātes masīvus un sakārtot tos dilstošā secībā. Tālāk es binarizēju pelēko skleja attēlu un izmantoju morfoloģiskā gradienta metodi un mLoren Shurasking, lai izceltu interesējošo reģionu (ROI). Nākamais solis ir apgriezt attēlu, lai melnajā fonā plaušu ROI būtu balta. Es izmantoju funkciju showMaskAsOverlay, lai parādītu 2 maskas. Piezīme: kodu iedvesmojusi Lorena Šure, saite.

Lasly, es izveidoju sarkanu kontūru, izmantojot bwbwboundaries un maskējot filtra attēlu un robežas.

a_thresh = I> = 172; % noteica šo slieksni

[labelImage, numberOfBlobs] = bwlabel (a_thresh);

rekvizīti = regionprops (a_thresh, 'all');

sortedSolidity = kārtot ([props. Solidity], 'nolaisties');

SB = sortedSolidity (1);

ja SB == 1 % SB pieņem tikai stingrību == 1 filtrē kaulus

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

imshow (binaryImage); krāsu karte (pelēka);

SE = strel ('kvadrāts', 3);

morfoloģiskais gradients = imsubtract (imdilate (binaryImage, SE), imerode (binaryImage, SE));

maska = imbinarize (morfoloģiskais gradients, 0,03);

SE = strel ('kvadrāts', 2);

maska = ielikt (maska, SE);

maska = imfill (maska, 'caurumi');

maska = bwareafilt (maska, 2); % kontroles skaits apgabalā parādīt

notMask = ~ maska;

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

showMaskAsOverlay (0,5, maska, 'r'); % jums ir jālejupielādē lietotne/funkcija showMaskAsOverlay

BW2 = imfill (binaryImage, 'caurumi');

jauns_attēls = BW2;

jauns_attēls (~ maska) = 0; % apgriezts fons un caurumi

B = robežas (jauns_attēls); % var pieņemt tikai 2 kategorijas

skaitlis (104);

imshow (jauns_attēls);

uzgaidi

robežas (B);

beigas

4. darbība. GUI izveide

Tagad mēs integrējam iepriekšējo kodu MATLAB lietotnē. Atveriet lietotņu noformētāju MATLAB (jauna> lietotne). Pirmkārt, mēs izstrādājam saskarni, turot nospiestu un trīs asis ievelkot centrālajā darba telpā. Tālāk mēs noklikšķiniet un turiet un velciet divas pogas, vienu rediģēšanas lauku (teksts), vienu rediģēšanas lauku (ciparu), vienu slīdni un vienu nolaižamo izvēlni. Katra no divām asīm parādīs priekšskatījumu un analizēja attēlu, bet trešās asis parādīs priekšskatījuma “atlasītā” attēla pikseļu histogrammu. Rediģēšanas lauka (teksta) lodziņā tiks parādīts atlasītā attēla faila ceļš, bet rediģēšanas laukā (skaitliskais) tiks parādīts plaušu noteiktais pikseļu laukums.

Tagad lietotņu noformētājā pārejiet no dizaina skata uz koda skatu. Ievadiet koda īpašumu kodu, noklikšķinot uz sarkanās pogas “Rekvizīti” ar pluszīmi. Inicializējiet rekvizītus I, slieksni un reģionusToExtract, kā norādīts tālāk norādītajā kodā. Pēc tam ar peles labo pogu noklikšķiniet uz pogas darbvietas augšējā labajā pusē (komponentu pārlūkprogramma) un pārejiet no atzvanīšanas> Atvērt atzvanīšanu. Pievienojiet kodu funkcijai SelectImageButtonPushed (lietotne, notikums). Šis kods ļauj atlasīt attēlu, ko analizēt no datora, izmantojot uigetfile. Pēc attēla izvēles zem asīm parādīsies priekšskatījuma attēls kopā ar histogrammu. Pēc tam ar peles labo pogu noklikšķiniet uz citas pogas un atkārtojiet to pašu procedūru, lai izveidotu atzvanīšanas funkciju.

Pievienojiet kodu zem funkcijas “AnalyzeImageButtonPushed (lietotne, notikums)”. Šis kods veiks pikseļu skaitīšanu un lāseļu noteikšanu priekšskatījuma attēlā, izmantojot attēla analīzes pogu (neatkarīgi no tā, kuru noklikšķinājāt ar peles labo pogu). Pēc pogu programmēšanas mēs tagad ieprogrammēsim slīdni un nolaižamo izvēlni. Ar peles labo pogu noklikšķiniet uz slīdņa, izveidojiet atzvanīšanas funkciju un līdz beigām pievienojiet kodu zem “function FilterThresholdSliderValueChanged (lietotne, notikums)”. Tas ļauj slīdnim pielāgot pelēkās intensitātes slieksni.

Izveidojiet atzvanīšanas funkciju nolaižamajai izvēlnei un pievienojiet kodu zem “function AreastoExtractDropDownValueChanged (lietotne, notikums)”, lai ļautu nolaižamajai izvēlnei mainīt uz analizēto attēlu asīm parādīto lāsīšu skaitu. Tagad komponentu pārlūkprogrammā noklikšķiniet uz katras entītijas un mainiet to rekvizītus pēc saviem ieskatiem, piemēram, mainiet entītiju nosaukumus, noņemiet asis un mainiet mērogošanu. Velciet un nometiet komponentu pārlūkprogrammas entītijas dizaina skatā uz funkcionālu un viegli saprotamu izkārtojumu. Tagad jums ir MATLAB lietotne, kas var analizēt plaušu attēlus pikseļu laukumam!

rekvizīti (piekļuve = privāta) I = ; % attēla fails

slieksnis = 257; %slieksnis pelēkās intensitātes binarizēšanai

regionalToExtract = 2;

beigas

funkcija SelectImageButtonPushed (lietotne, notikums)

clc; Dir = 'C: / Users / danie / Downloads / images_004 / images'; %definēt nemainīgu failu "prefikss"

[imageExt, path] = uigetfile ('*. png'); %satveriet attēla nosaukuma mainīgo daļu

imageName = [Dir filesep imageExt]; %sasaistītie nemainīgie un mainīgie slīpumi

app. I = imread (attēla nosaukums); %lasīja attēlu

imshow (lietotne I, 'vecāks', lietotne. UIAxes); %parāda attēlu

app. FilePathEditField. Value = ceļš; %attēlo faila ceļu, no kurienes radies oriģinālais attēls

beigas

funkcija AnalyzeImageButtonPushed (lietotne, notikums)

originalImage = app. I;

originalImage = wiener2 (app. I, [5 5]); %punktu noņemšanas filtrs

histogramma (app. AxesHistogram, app. I, 256); %parāda attēla histogrammu

a_thresh = originalImage> = app.threshold; % noteica šo slieksni

labelImage = bwlabel (a_thresh);

rekvizīti = regionprops (a_thresh, 'all');

sortedSolidity = kārtot ([props. Solidity], 'nolaisties');

SB = sortedSolidity (1);

ja SB == 1 % SB pieņem tikai stingrību == 1 filtrē kaulus

SE = strel ('kvadrāts', 3);

morfoloģiskais gradients = imsubtract (imdilate (labelImage, SE), imerode (labelImage, SE));

maska = imbinarize (morfoloģiskais gradients, 0,03);

SE = strel ('kvadrāts', 2);

maska = ielikt (maska, SE);

maska = imfill (maska, 'caurumi');

maska = bwareafilt (maska, app.regionsToExtract);

% kontroles skaits apgabalā parādīt

notMask = ~ maska;

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

BW2 = imfill (labelImage, 'caurumi');

jauns_attēls = BW2;

jauns_attēls (~ maska) = 0;

B = robežas (jauns_attēls); % var pieņemt tikai 2 kategorijas imshow (new_image, 'parent', app. UIAxes2);

turēt (app. UIAxes2, 'on');

robežas (B);

komplekts (gca, 'YDir', 'reverss');

lungArea = bwarea (jauns_attēls);

app. PixelAreaEditField. Value = lungArea;

beigas

beigas

funkcija FilterThresholdSliderValueChanged (lietotne, notikums)

app.threshold = app. FilterThresholdSlider. Value;

beigas

function AreastoExtractDropDownValueChanged (lietotne, notikums) stringNumber = app. AreastoExtractDropDown. Value;

app.regionsToExtract = str2double (stringNumber);

beigas

beigas

Ieteicams: