Taula de continguts:

Segmentació pulmonar MatLab: 5 passos
Segmentació pulmonar MatLab: 5 passos

Vídeo: Segmentació pulmonar MatLab: 5 passos

Vídeo: Segmentació pulmonar MatLab: 5 passos
Vídeo: Threshold in Matlab with Otsu Method 2024, De novembre
Anonim
Segmentació pulmonar MatLab
Segmentació pulmonar MatLab

Per: Phuc Lam, Paul Yeung, Eric Reyes

Sabent que els errors en la segmentació dels pulmons produiran informació falsa sobre la identificació d’una zona de malaltia i poden afectar directament el procés de diagnòstic. Les tècniques modernes d’ajuda per ordinador no van aconseguir resultats precisos quan les malalties pulmonars tenen formes difícils. Aquestes formes anormals poden ser causades per efusions pleurals, consolidacions, etc. Aplicant la tècnica de segmentació pulmonar, en què els límits del pulmó s’aïllen del teixit toràcic que l’envolta, la nostra aplicació pot identificar els límits amb els llindars d’entrada de l’usuari per obtenir vistes totalment personalitzables. de les formes dels pulmons, L’objectiu d’aquest projecte MatLab és crear una aplicació interactiva de segmentació pulmonar fàcil d’utilitzar per detectar les condicions patològiques de les imatges de raigs X dels pulmons. El nostre objectiu és crear una manera més eficaç d’il·lustrar i identificar pulmons anormals per donar als metges i als radiòlegs una manera més fiable de diagnosticar malalties pulmonars. Mitjançant l’eina de disseny d’aplicacions de MatLab, el programa està dissenyat per treballar específicament amb exploracions de radiografia de tòrax i tomografia computada (TC), però també es prova per funcionar amb exploracions de ressonància magnètica.

Les instruccions següents contenen la nostra tècnica de filtrat de soroll (filtre Wiener de pas baix), així com el llindar de la imatge (mitjançant l’histograma d’intensitat de la imatge en escala de grisos) i mitjançant un gradient morfològic (la diferència entre la dilatació i l’erosió d’una imatge) per identificar una regió d’interès. A continuació, la instrucció explicarà com integrem tots els elements a la interfície gràfica d'usuari (GUI).

Nota:

1). Aquest projecte s’inspira en un article de recerca: "Segmentació i anàlisi d’imatges de pulmons anormals a la TC: enfocaments actuals, desafiaments i tendències futures". Que es pot trobar aquí

2). Estem utilitzant imatges de raigs X de NIH: Clinical Center. L’enllaç es pot trobar aquí

3). Podeu trobar ajuda per al dissenyador d'aplicacions aquí

4). Abans d’executar el codi: heu de canviar la ruta Dir (a la línia 34) al directori de fitxers i el tipus d’imatge (línia 35) (estem analitzant *.png).

Pas 1: pas 1: càrrega de la imatge

Pas 1: carregar la imatge
Pas 1: carregar la imatge

Aquest pas us mostrarà la imatge original a escala de grisos. Canvieu el "nom_de_imatge.png" pel nom de la vostra imatge

clar; clc; tancar-ho tot;

%% Carregant imatges

raw_x_ray = 'nom_de_imatge.png';

I = imread (raw_x_ray);

figura (101);

imshow (I);

mapa de colors (gris);

title ('Radiografia en escala de grisos');

Pas 2: Pas 2: filtratge de soroll i histograma

Pas 2: filtratge de soroll i histograma
Pas 2: filtratge de soroll i histograma

Per tal de trobar el llindar de la imatge a escala de grisos, mirem l'histograma per veure si hi ha modes diferents. Llegiu-ne més aquí

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

figura (102);

subtrama (2, 1, 1);

imshow (I);

subtrama (2, 1, 2);

imhist (I, 256);

Pas 3: Pas 3: Configuració de llindars

Pas 3: Configuració de llindars
Pas 3: Configuració de llindars
Pas 3: Configuració de llindars
Pas 3: Configuració de llindars

Aquest pas us permet establir el llindar segons l'histograma. morphologicalGradient ressaltarà la regió d’interès en vermell i la funció visboundaries recobreix la imatge esbossada i filtrada del pulmó en vermell.

Mitjançant l’ús de regionalprops, podem aplicar les matrius de solidesa i ordenar-les de manera descendent. A continuació, binaritzo la imatge de sclae gris i aplico el mètode de gradient morfològic i mLoren Shurasking per ressaltar la regió d’interès (ROI). El següent pas és invertir la imatge perquè el ROI del pulmó sigui blanc en el fons negre. Utilitzo la funció showMaskAsOverlay per mostrar 2 màscares. Nota: el codi està inspirat en Loren Shure, enllaç.

Lasly, creo un esquema vermell mitjançant l'ús de bwbwboundaries i emmascarant la imatge del filtre i els límits.

a_thresh = I> = 172; % ha establert aquest llindar

[labelImage, numberOfBlobs] = bwlabel (a_thresh);

props = regionprops (a_thresh, 'all');

sortedSolidity = ordenar ([props. Solidity], 'descendir');

SB = ordenat Solidesa (1);

si SB == 1% SB només accepta solidesa == 1 filtra els ossos

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

imshow (binaryImage); mapa de colors (gris);

SE = strel ("quadrat", 3);

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

màscara = imbinar (morfologicalGradient, 0,03);

SE = strel ('quadrat', 2);

màscara = imclose (màscara, SE);

màscara = omplir (màscara, 'forats');

màscara = bwareafilt (màscara, 2); % nombre de control de mostra de l'àrea

notMask = ~ màscara;

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

showMaskAsOverlay (0,5, màscara, 'r'); % heu de descarregar l'aplicació / funció showMaskAsOverlay

BW2 = imfill (binaryImage, 'forats');

nova_imatge = BW2;

nova_imatge (~ màscara) = 0; % de fons i forats invertits

B = fronteres bw (nova_imatge); % només pot acceptar 2 dimensions

figura (104);

imshow (nova_imatge);

espera

límits viscuts (B);

final

Pas 4: creació de la GUI

Ara, integrem el codi anterior en una aplicació MATLAB. Obriu el Dissenyador d'aplicacions a MATLAB (Nou> Aplicació). En primer lloc, dissenyem la interfície fent clic i mantenint premut i arrossegant tres eixos a l’espai de treball central. A continuació, fem clic-mantingueu-arrossegueu dos botons, un camp d'edició (text), un camp d'edició (numèric), un control lliscant i un menú desplegable. Dos eixos mostraran cadascun la vista prèvia i analitzaran la imatge, i els tercers eixos mostraran un histograma de píxels per a la imatge "seleccionada" de vista prèvia. El quadre d'edició (text) mostrarà la ruta del fitxer de la imatge seleccionada i el camp d'edició (numèric) mostrarà l'àrea de píxels detectada dels pulmons.

Ara canvieu de la visualització de disseny a la de codi a App Designer. Introduïu al codi el codi de les propietats fent clic al botó vermell "Propietats" amb el signe més al seu costat. Inicialitzeu les propietats I, el llindar i regionsToExtract tal com es mostra al codi que es proporciona a continuació. A continuació, feu clic amb el botó dret a un botó a la part superior dreta de l'espai de treball (el navegador de components) i aneu des de Devolucions de trucades> Ves a … devolució de trucada. Afegiu el codi per a la "funció SelectImageButtonPush (aplicació, esdeveniment)". Aquest codi us permet seleccionar una imatge per analitzar des del vostre ordinador mitjançant uigetfile. Després de seleccionar una imatge, apareixerà una imatge de previsualització sota els eixos acompanyada d’un histograma. A continuació, feu clic amb el botó dret a l’altre botó i repetiu el mateix procediment per crear una funció de devolució de trucada.

Afegiu el codi que hi ha a sota de la "funció AnalyzeImageButtonPush (aplicació, esdeveniment)". Aquest codi realitzarà el recompte de píxels i la detecció de blob a la imatge de previsualització amb el botó d'anàlisi de la imatge (el que hagueu fet clic amb el botó dret del ratolí per obtenir aquest codi). Després de programar els botons, ara programarem el control lliscant i el menú desplegable. Feu clic amb el botó dret del ratolí sobre el control lliscant, creeu una funció de devolució de trucada i afegiu-hi el codi a sota de la funció "FilterThresholdSliderValueChanged (app, event)" fins al final. Això permet al control lliscant ajustar el llindar d’intensitat de grisos.

Creeu una funció de devolució de trucada per al menú desplegable i afegiu-hi el codi que apareix a sota de la "funció AreastoExtractDropDownValueChanged (aplicació, esdeveniment)" per permetre al menú desplegable modificar el nombre de blobs que es mostren als eixos de la imatge analitzada. Ara, feu clic a cada entitat al navegador de components i canvieu les seves propietats al vostre gust, com ara canviar els noms de les entitats, eliminar eixos i canviar l'escala. Arrossegueu i deixeu anar les entitats del navegador de components a la vista de disseny fins a un disseny funcional i fàcil d'entendre. Ara teniu una aplicació a MATLAB que pot analitzar imatges de pulmons per a l'àrea de píxels.

propietats (Accés = privat) I = ; % fitxer d'imatge

llindar = 257; % llindar per binaritzar la intensitat del gris

regionsToExtract = 2;

final

funció SelectImageButtonPush (aplicació, esdeveniment)

clc; Dir = 'C: / Users / danie / Downloads / images_004 / images'; % defineix el fitxer invariable "prefix"

[imageExt, path] = uigetfile ('*. png'); % agafa la part variable del nom de la imatge

imageName = [Dir fitxersep imageExt]; % concatenar cordons invariables i variables

app. I = imread (imageName); % llegeix la imatge

imshow (app. I, 'pare', app. UIAxes); % mostra la imatge

app. FilePathEditField. Value = ruta; Percentatge de visualització del fitxer% d'on prové la imatge original

final

funció AnalyzeImageButtonPush (aplicació, esdeveniment)

originalImage = app. I;

Imatge original = wiener2 (app. I, [5 5]); % filtre d'eliminació de punts

histograma (app. AxesHistogram, app. I, 256); % mostra l'histograma de la imatge

a_thresh = originalImage> = app.threshold; % ha establert aquest llindar

labelImage = bwlabel (a_thresh);

props = regionprops (a_thresh, 'all');

sortedSolidity = ordenar ([props. Solidity], 'descendir');

SB = ordenat Solidesa (1);

si SB == 1% SB només accepta solidesa == 1 filtra els ossos

SE = strel ("quadrat", 3);

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

màscara = imbinar (morfologicalGradient, 0,03);

SE = strel ('quadrat', 2);

màscara = imclose (màscara, SE);

màscara = omplir (màscara, 'forats');

màscara = bwareafilt (màscara, app.regionsToExtract);

% nombre de control de mostra de l'àrea

notMask = ~ màscara;

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

BW2 = emplenament (labelImage, 'forats');

nova_imatge = BW2;

nova_imatge (~ màscara) = 0;

B = fronteres bw (nova_imatge); % només pot acceptar imshow de 2 dimensions (new_image, 'parent', app. UIAxes2);

hold (app. UIAxes2, 'on');

límits viscuts (B);

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

lungArea = bwarea (nova_imatge);

app. PixelAreaEditField. Value = LungArea;

final

final

funció FilterThresholdSliderValueChanged (aplicació, esdeveniment)

app.threshold = app. FilterThresholdSlider. Value;

final

funció AreastoExtractDropDownValueChanged (aplicació, esdeveniment) stringNumber = app. AreastoExtractDropDown. Value;

app.regionsToExtract = str2double (stringNumber);

final

final

Recomanat: