Cuprins:

Segmentarea pulmonară MatLab: 5 pași
Segmentarea pulmonară MatLab: 5 pași

Video: Segmentarea pulmonară MatLab: 5 pași

Video: Segmentarea pulmonară MatLab: 5 pași
Video: Mecánica Pulmonar: Lazo cerrado en Matlab 2024, Iunie
Anonim
Segmentarea pulmonară MatLab
Segmentarea pulmonară MatLab

De: Phuc Lam, Paul Yeung, Eric Reyes

Știind că erorile din segmentarea plămânilor vor produce informații false cu privire la identificarea unei zone de boală și pot afecta direct procesul de diagnostic. Tehnicile moderne de asistență computerizată nu au reușit să ofere rezultate exacte atunci când bolile pulmonare au forme provocatoare. Aceste forme anormale pot fi cauzate de revărsări pleurale, consolidări etc. Aplicând tehnica segmentării pulmonare, în care limitele plămânului sunt izolate de țesutul toracic înconjurător, aplicația noastră poate identifica limitele cu pragurile de intrare ale utilizatorului pentru a oferi vizualizări complet personalizabile. a formelor plămânilor, Scopul acestui proiect MatLab este de a crea o aplicație interactivă de segmentare pulmonară interactivă pentru a detecta condițiile patologice ale imaginilor cu raze X ale plămânilor. Scopul nostru este de a crea un mod mai eficient de a ilustra și identifica plămânii anormali pentru a oferi medicilor și radiologilor un mod mai fiabil de a diagnostica bolile pulmonare. Folosind instrumentul de proiectare a aplicațiilor din MatLab, programul este conceput pentru a funcționa în mod specific cu radiografie toracică și tomografie computerizată (CT), dar este testat și pentru a funcționa cu scanări RMN.

Instrucțiunile de mai jos conțin tehnica noastră de filtrare a zgomotului (filtru Wiener low-pass), precum și pragul imaginii (utilizând histograma de intensitate a imaginii în tonuri de gri) și folosind un gradient morfologic (diferența dintre dilatarea și eroziunea unei imagini) la identifică o regiune de interes. Instrucțiunea va explica apoi modul în care integrăm toate elementele în interfața grafică cu utilizatorul (GUI).

Notă:

1). Acest proiect este inspirat de o lucrare de cercetare: "Segmentarea și analiza imaginii plămânilor anormali la CT: abordări actuale, provocări și tendințe viitoare". Ceea ce puteți găsi aici

2). Folosim imagini cu raze X de la NIH: Clinical Center. Linkul poate fi găsit aici

3). Ajutorul proiectantului de aplicații poate fi găsit aici

4). Înainte de a rula codul: trebuie să schimbați calea Dir (în linia 34) în directorul de fișiere și tipul imaginii (linia 35) (analizăm *.png).

Pasul 1: Pasul 1: Încărcarea imaginii

Pasul 1: Încărcarea imaginii
Pasul 1: Încărcarea imaginii

Acest pas vă va arăta imaginea originală la scară de gri. Schimbați „name_of_picture.png” cu numele imaginii

clar; clc; inchide tot;

%% Se încarcă imagini

raw_x_ray = 'name_of_picture.png';

I = imread (raw_x_ray);

figura (101);

imshow (I);

colormap (gri);

titlu („Radiografie în tonuri de gri”);

Pasul 2: Pasul 2: Filtrarea zgomotului și histograma

Pasul 2: Filtrarea zgomotului și histograma
Pasul 2: Filtrarea zgomotului și histograma

Pentru a găsi pragul pentru imaginea la scară de gri, ne uităm la histogramă pentru a vedea dacă există moduri distincte. Citiți mai multe aici

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

figura (102);

subtrama (2, 1, 1);

imshow (I);

subtrama (2, 1, 2);

imhist (I, 256);

Pasul 3: Pasul 3: Setarea pragurilor

Pasul 3: Setarea pragurilor
Pasul 3: Setarea pragurilor
Pasul 3: Setarea pragurilor
Pasul 3: Setarea pragurilor

Acest pas vă permite să setați pragul în funcție de histogramă. morphologicalGradient va evidenția regiunea de interes pentru roșu, iar funcția visboundaries suprapune imaginea conturată și filtrată a plămânului în roșu.

Folosind regionprops, putem stabili matricile de soliditate și le putem ordona în descrescătoare. Apoi binarizez imaginea sclae gri și aplic metoda gradientului morflogic și mLoren Shurasking pentru a evidenția regiunea de interes (ROI). Următorul pas este să inversați imaginea, astfel încât rentabilitatea investiției plămânilor să fie albă pe fundalul negru. Folosesc funcția showMaskAsOverlay pentru a afișa 2 măști. Notă: codul este inspirat din Loren Shure, link.

Lasly, creez contur roșu folosind bwbwboundaries și mascând imaginea filtrului și limitele.

a_thresh = I> = 172; % a stabilit acest prag

[labelImage, numberOfBlobs] = bwlabel (a_thresh);

props = regionprops (a_thresh, 'all');

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

SB = SortedSolidity (1);

dacă SB == 1% SB acceptă doar soliditatea == 1 filtrează oasele

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

imshow (binaryImage); colormap (gri);

SE = strel („pătrat”, 3);

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

masca = imbinariza (morfologicGradient, 0,03);

SE = strel („pătrat”, 2);

mască = imclose (mask, SE);

mask = imfill (mască, 'găuri');

mask = bwareafilt (mask, 2); % număr de control al afișării zonei

notMask = ~ mask;

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

showMaskAsOverlay (0,5, mască, 'r'); % trebuie să descărcați aplicația / funcția showMaskAsOverlay

BW2 = imfill (binaryImage, 'găuri');

new_image = BW2;

new_image (~ mask) = 0; % inversați fundalul și găurile

B = frontiere bw (imagine_ nouă); % poate accepta doar 2 dimensiuni

figura (104);

imshow (new_image);

stai asa

limitele vizuale (B);

Sfârșit

Pasul 4: Crearea GUI

Acum, integrăm codul anterior într-o aplicație MATLAB. Deschideți aplicația Designer în MATLAB (Nou> Aplicație). În primul rând, proiectăm interfața făcând clic-țineți-și țineți în trei axe în spațiul de lucru central. Apoi, facem clic-țineți-trageți două butoane, un câmp de editare (text), un câmp de editare (numeric), un glisor și un meniu derulant. Două axe vor afișa fiecare previzualizare și vor analiza imaginea, iar a treia axe va afișa o histogramă de pixeli pentru imaginea „selectată” de previzualizare. Câmpul de editare (text) va afișa calea fișierului imaginii selectate, iar câmpul de editare (numeric) va afișa suprafața de pixeli detectată a plămânilor.

Acum comutați de la vizualizarea de proiectare la vizualizarea de cod în App Designer. Introduceți în cod codul pentru proprietăți făcând clic pe butonul roșu „Proprietăți” cu semnul plus lângă acesta. Inițializați proprietățile I, pragul și regiunile ToExtract ca în codul furnizat mai jos. Apoi, faceți clic dreapta pe un buton din partea dreaptă sus a spațiului de lucru (browserul de componente) și accesați Apeluri> Accesați … apelare. Adăugați codul pentru „funcția SelectImageButtonPush (aplicație, eveniment)”. Acest cod vă permite să selectați o imagine de analizat de pe computer utilizând uigetfile. După selectarea unei imagini, o imagine de previzualizare va apărea sub axe însoțită de o histogramă. Apoi, faceți clic dreapta pe celălalt buton și repetați aceeași procedură pentru a crea o funcție de apel invers.

Adăugați codul de sub „funcția AnalyzeImageButtonPush (aplicație, eveniment)”. Acest cod va efectua numărarea pixelilor și detectarea blob-ului pe imaginea de previzualizare de pe butonul de analiză a imaginii (pe oricare ați făcut clic dreapta pentru acest cod). După programarea butoanelor, vom programa acum glisorul și meniul derulant. Faceți clic dreapta pe glisor, creați o funcție de apel invers și adăugați codul sub „funcția FilterThresholdSliderValueChanged (aplicație, eveniment)” până la sfârșit. Aceasta permite glisorului să regleze pragul de intensitate a griului.

Creați o funcție de apel invers pentru meniul derulant și adăugați codul sub „funcția AreastoExtractDropDownValueChanged (aplicație, eveniment)” pentru a permite meniului derulant să modifice numărul de bloburi afișate pe axele imaginii analizate. Acum, faceți clic pe fiecare entitate din browserul de componente și schimbați-le proprietățile după cum doriți, cum ar fi schimbarea numelor entităților, eliminarea axelor și schimbarea scalării. Trageți și fixați entitățile din browserul de componente în vizualizarea proiectare într-un aspect funcțional și ușor de înțeles. Aveți acum o aplicație în MATLAB care poate analiza imagini ale plămânilor pentru suprafața pixelilor!

proprietăți (Acces = privat) I = ; % fișier imagine

prag = 257; % prag pentru intensitatea cenușii binarizante

regionsToExtract = 2;

Sfârșit

funcție SelectImageButtonPush (aplicație, eveniment)

clc; Dir = 'C: / Users / danie / Downloads / images_004 / images'; % definește „prefixul” fișierului invariabil

[imageExt, cale] = uigetfile ('*. png'); % apucați partea variabilă a numelui imaginii

imageName = [Dir filesep imageExt]; % concatenează corzile variabile și invariabile

app. I = imread (imageName); % citește imaginea

imshow (app. I, „părinte”, app. UIAxes); % afișează imaginea

app. FilePathEditField. Value = cale; % afișează calea fișierului de unde provine imaginea originală

Sfârșit

funcție AnalyzeImageButtonPush (aplicație, eveniment)

originalImage = app. I;

OriginalImage = wiener2 (app. I, [5 5]); % filtru de eliminare a punctelor

histogramă (app. AxesHistogram, app. I, 256); % afișează histograma imaginii

a_thresh = originalImage> = app.threshold; % a stabilit acest prag

labelImage = bwlabel (a_thresh);

props = regionprops (a_thresh, 'all');

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

SB = SortedSolidity (1);

dacă SB == 1% SB acceptă numai soliditatea == 1 filtrează oasele

SE = strel („pătrat”, 3);

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

masca = imbinariza (morfologicGradient, 0,03);

SE = strel („pătrat”, 2);

mască = imclose (mask, SE);

mask = imfill (mască, 'găuri');

mask = bwareafilt (mask, app.regionsToExtract);

% număr de control al afișării zonei

notMask = ~ mask;

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

BW2 = imfill (labelImage, 'găuri');

new_image = BW2;

new_image (~ mask) = 0;

B = frontiere bw (imagine_ nouă); % poate accepta doar 2 dimensiuni imshow (new_image, 'parent', app. UIAxes2);

hold (app. UIAxes2, 'on');

limitele vizuale (B);

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

lungArea = bwarea (new_image);

app. PixelAreaEditField. Value = lungArea;

Sfârșit

Sfârșit

funcție FilterThresholdSliderValueChanged (aplicație, eveniment)

app.threshold = app. FilterThresholdSlider. Value;

Sfârșit

funcția AreastoExtractDropDownValueChanged (aplicație, eveniment) stringNumber = app. AreastoExtractDropDown. Value;

app.regionsToExtract = str2double (stringNumber);

Sfârșit

Sfârșit

Recomandat: