INHOUDSOPGAWE:

MatLab -longsegmentasie: 5 stappe
MatLab -longsegmentasie: 5 stappe

Video: MatLab -longsegmentasie: 5 stappe

Video: MatLab -longsegmentasie: 5 stappe
Video: Six-year-old girl is a skateboarding prodigy 2024, November
Anonim
MatLab -longsegmentasie
MatLab -longsegmentasie

Deur: Phuc Lam, Paul Yeung, Eric Reyes

As u erken dat foute in die segmentering van die longe vals inligting sal oplewer rakende die identifisering van 'n siektegebied, en dit kan die diagnose proses direk beïnvloed. Moderne rekenaarhulptegnieke het nie akkurate resultate gelewer as longsiektes uitdagende vorms het nie. Hierdie abnormale vorms kan veroorsaak word deur pleurale effusies, konsolidasies, ens. Deur die longsegmentasietegniek toe te pas, waarin die grense van die long van die omliggende torakale weefsel geïsoleer word, kan ons app die grense identifiseer met die invoerdrempels van die gebruiker om volledig aanpasbare aansigte te gee van die vorms van die longe, Die doel van hierdie MatLab-projek is om 'n gebruikersvriendelike interaktiewe longsegmentasie-app te skep om patologiese toestande van die longe se X-straalbeelde op te spoor. Ons doel is om 'n meer effektiewe manier te skep om abnormale longe te illustreer en te identifiseer om dokters en radioloë 'n meer betroubare manier te gee om longsiektes te diagnoseer. Met behulp van die app-ontwerperhulpmiddel in MatLab, is die program ontwerp om spesifiek te werk met borskas-röntgen- en rekenaartomografie (CT) -skanderings, maar dit word ook getoets om met MRI-skanderings te werk.

Die onderstaande instruksies bevat ons ruisfiltreringstegniek (lae-pas Wiener-filter), sowel as die beelddrempel (deur die intensiteitshistogram van die grysskaalbeeld te gebruik) en 'n morfologiese gradiënt (die verskil tussen die verwyding en die erosie van 'n beeld) tot 'n belangegebied identifiseer. Die instruksie sal dan verduidelik hoe ons al die elemente in die grafiese gebruikerskoppelvlak (GUI) integreer.

Let wel:

1). Hierdie projek is geïnspireer deur 'n navorsingsartikel: "Segmentasie en beeldanalise van abnormale longe by CT: huidige benaderings, uitdagings en toekomstige tendense". Wat hier gevind kan word

2). Ons gebruik röntgenfoto's van NIH: Clinical Center. Die skakel kan hier gevind word

3). Appontwerperhulp kan hier gevind word

4). Voordat u die kode gebruik: moet u die Dir -pad (in reël 34) verander na u lêergids en tipe prent (reël 35) (ons ontleed *.png).

Stap 1: Stap 1: Laai prent

Stap 1: Laai prent
Stap 1: Laai prent

Hierdie stap wys u die oorspronklike prentjie in grys skaal. Verander die 'name_of_picture.png' na u prentnaam

duidelik; clc; sluit almal;

%% Laai prente

raw_x_ray = 'name_of_picture.png';

I = lees (raw_x_ray);

figuur (101);

imshow (I);

kleurkaart (grys);

titel ('Grysskaal X-straal');

Stap 2: Stap 2: Ruisfilter en histogram

Stap 2: Ruisfilter en histogram
Stap 2: Ruisfilter en histogram

Om die drumpel vir die grysskaalbeeld te vind, kyk ons na die histogram om te sien of daar verskillende modi is. Lees meer hier

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

figuur (102);

subplot (2, 1, 1);

imshow (I);

subplot (2, 1, 2);

imhisties (I, 256);

Stap 3: Stap 3: Stel drempels

Stap 3: Stel drempels in
Stap 3: Stel drempels in
Stap 3: Stel drempels in
Stap 3: Stel drempels in

Met hierdie stap kan u die drempel volgens die histogram stel. morfologiesGradient sal die gebied van belangstelling in rooi beklemtoon, en die funksie oor grense lê die omlynde en gefiltreerde beeld van die long in rooi.

Deur regionprops te gebruik, kan ons die matrieke van soliditeit bepaal en dit in dalende volgorde sorteer. Vervolgens binariseer ek die grys skelbeeld en pas die morflogiese gradiëntmetode en mLoren Shurasking toe om die belangstelling (ROI) uit te lig. Die volgende stap is om die beeld om te keer sodat die long -ROI wit is op die swart agtergrond. Ek gebruik die funksie showMaskAsOverlay om 2 masker te vertoon. Let wel: die kode is geïnspireer deur Loren Shure, link.

Lasly, ek skep 'n rooi omtrek deur die bwbw -grense te gebruik en die filterbeeld en die grense te verberg.

a_driek = I> = 172; % stel hierdie drempel

[labelImage, numberOfBlobs] = bwlabel (a_thresh);

rekwisiete = regionprops (a_thresh, 'alles');

sortedSolidity = sort ([props. Solidity], 'daal');

SB = sortedSolidity (1);

as SB == 1 % SB slegs soliditeit aanvaar == 1 filter bene uit

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

imshow (binaryImage); kleurkaart (grys);

SE = strel ('square', 3);

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

masker = imbinariseer (morphologicalGradient, 0.03);

SE = strel ('square', 2);

masker = sluit (masker, SE);

masker = invul (masker, 'gate');

masker = bwareafilt (masker, 2); % kontrole getal gebied toon

notMask = ~ masker;

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

showMaskAsOverlay (0.5, masker, 'r'); % u moet die program/funksie showMaskAsOverlay aflaai

BW2 = imfill (binaryImage, 'gate');

nuwe_beeld = BW2;

nuwe_beeld (~ masker) = 0; % keer agtergrond en gate om

B = bwgrense (nuwe_beeld); % kan slegs 2 dimensies aanvaar

figuur (104);

imshow (nuwe_beeld);

hou vas

grensgrense (B);

einde

Stap 4: Skep GUI

Nou integreer ons die vorige kode in 'n MATLAB -app. Maak die App Designer oop in MATLAB (Nuut> App). Eerstens ontwerp ons die koppelvlak deur te klik-hou-in en in drie asse na die middelste werkruimte te sleep. Vervolgens klik en hou ons twee knoppies, een wysigingsveld (teks), een wysigingsveld (numeries), een skuifbalk en een keuselys. Twee asse sal elkeen die voorskou vertoon en die prent ontleed, en die derde as sal 'n histogram van pixels vir die voorgeskrewe "geselekteerde" beeld vertoon. Die wysigingsveld (teks) boks sal die lêerpad van die geselekteerde prent vertoon, en die wysigingsveld (numeries) sal die gedetailleerde pixelarea van die longe vertoon.

Skakel nou van ontwerpweergawe na kode -aansig in App Designer. Tik die kode vir eiendomme in die kode deur op die rooi "Eienskappe" -knoppie te klik met 'n plusteken daarby. Initialiseer die eienskappe I, drempel en regionsToExtract soos in die kode hieronder verskaf. Klik dan met die rechtermuisknop op 'n knoppie regs bo in die werkruimte (die komponentblaaier) en gaan na Terugbel> Gaan na … terugbel. Voeg die kode by vir "funksie SelectImageButtonPushed (app, gebeurtenis)." Met hierdie kode kan u 'n prent kies om van u rekenaar te ontleed met uigetfile. Nadat u 'n prent gekies het, verskyn 'n voorskoubeeld onder die asse vergesel van 'n histogram. Klik dan met die rechtermuisknop op die ander knoppie en herhaal dieselfde prosedure om 'n terugbelfunksie te skep.

Voeg die kode in onder "funksie AnalyzeImageButtonPushed (app, gebeurtenis)." Hierdie kode sal die pixeltelling en blob-opsporing op die voorskou-prent uitvoer op die analise-beeldknoppie (watter een u ook met die rechtermuisknop vir hierdie kode geklik het). Nadat ons die knoppies geprogrammeer het, programmeer ons nou die skuifbalk en die keuselys. Klik met die rechtermuisknop op die skuifbalk, skep 'n terugbelfunksie en voeg die kode in onder "funksie FilterThresholdSliderValueChanged (app, gebeurtenis)" tot die einde. Hierdeur kan die skuifbalk die grysintensiteitsdrempel aanpas.

Skep 'n terugbelfunksie vir die keuselys en voeg die kode by onder "funksie AreastoExtractDropDownValueChanged (app, gebeurtenis)" sodat die keuselys die aantal blobs wat op die geanaliseerde beeldas vertoon word, kan verander. Klik nou op elke entiteit in die komponentblaaier en verander hul eienskappe na u smaak, soos om die name van die entiteite te verander, asse te verwyder en die skaal te verander. Sleep die entiteite van die komponentblaaier in die ontwerpaansig na 'n funksionele en maklik verstaanbare uitleg. U het nou 'n app in MATLAB wat beelde van die longe vir die pixelarea kan ontleed!

eiendomme (Toegang = privaat) I = ; % prentlêer

drempel = 257; %drempel vir die binarisering van grys intensiteit

regionsToExtract = 2;

einde

funksie SelectImageButtonPushed (app, gebeurtenis)

clc; Dir = 'C: / Users / danie / Downloads / images_004 / images'; %definieer onveranderlike lêer "voorvoegsel"

[imageExt, pad] = uigetfile ('*. png'); %gryp die veranderlike deel van die prentnaam aan

imageName = [Dir filesep imageExt]; %verbind onveranderlike en veranderlike snare

app. I = imread (imageName); %het die prent gelees

imshow (app. I, 'ouer', app. UIAxes); %vertoon die beeld

app. FilePathEditField. Value = pad; %vertoonlêerpad van waar die oorspronklike prent vandaan kom

einde

funksie AnalyzeImageButtonPushed (app, gebeurtenis)

originalImage = app. I;

originalImage = wiener2 (app. I, [5 5]); %puntverwyderingsfilter

histogram (app. AxesHistogram, app. I, 256); %vertoon histogram van beeld

a_thresh = originalImage> = app.drempel; % stel hierdie drempel

labelImage = bwlabel (a_thresh);

rekwisiete = regionprops (a_thresh, 'alles');

sortedSolidity = sort ([props. Solidity], 'daal');

SB = sortedSolidity (1);

as SB == 1 % SB slegs soliditeit aanvaar == 1 filter bene uit

SE = strel ('square', 3);

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

masker = imbinariseer (morphologicalGradient, 0.03);

SE = strel ('square', 2);

masker = sluit (masker, SE);

masker = invul (masker, 'gate');

masker = bwareafilt (masker, app.regionsToExtract);

% kontrole getal gebied toon

notMask = ~ masker;

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

BW2 = imfill (labelImage, 'gate');

nuwe_beeld = BW2;

nuwe_beeld (~ masker) = 0;

B = bwgrense (nuwe_beeld); % kan slegs 2 dimensies imshow (new_image, 'ouer', app. UIAxes2) aanvaar;

hou (app. UIAxes2, 'aan');

grensgrense (B);

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

longArea = bwarea (new_image);

app. PixelAreaEditField. Value = lungArea;

einde

einde

funksie FilterThresholdSliderValueChanged (app, gebeurtenis)

app.threshold = app. FilterThresholdSlider. Value;

einde

funksie AreastoExtractDropDownValueChanged (app, event) stringNumber = app. AreastoExtractDropDown. Value;

app.regionsToExtract = str2double (stringNumber);

einde

einde

Aanbeveel: