Tartalomjegyzék:

MatLab tüdőszegmentáció: 5 lépés
MatLab tüdőszegmentáció: 5 lépés

Videó: MatLab tüdőszegmentáció: 5 lépés

Videó: MatLab tüdőszegmentáció: 5 lépés
Videó: What Is MATLAB? 2024, Június
Anonim
MatLab tüdőszegmentáció
MatLab tüdőszegmentáció

Szerző: Phuc Lam, Paul Yeung, Eric Reyes

Annak elismerése, hogy a tüdő szegmentációjában fellépő hibák hamis információkat eredményeznek a betegségterület azonosításával kapcsolatban, és közvetlenül befolyásolhatják a diagnózis folyamatát. A modern számítógépes segítő technikák nem tudtak pontos eredményeket elérni, ha a tüdőbetegségek kihívást jelentő formájúak. Ezeket a rendellenes formákat okozhatják mellhártya -effúziók, konszolidációk stb. A tüdő szegmentálási technikáját alkalmazva, amelyben a tüdő határait elkülönítik a környező mellkasi szövetektől, alkalmazásunk képes azonosítani a határokat a felhasználó beviteli küszöbével, hogy teljes mértékben testreszabható nézeteket biztosítson a tüdő alakjairól, Ennek a MatLab projektnek a célja egy felhasználóbarát interaktív tüdőszegmentációs alkalmazás létrehozása a tüdő röntgenfelvételeinek kóros állapotának kimutatására. Célunk, hogy hatékonyabb módszert hozzunk létre a kóros tüdő szemléltetésére és azonosítására annak érdekében, hogy az orvosok és a radiológusok megbízhatóbb módot kapjanak a tüdőbetegségek diagnosztizálására. A MatLab alkalmazás-tervező eszközét használva a program kifejezetten mellkasi röntgen- és számítógépes tomográfiás (CT) vizsgálatokkal való együttműködésre készült, de tesztelték, hogy működjön-e MRI-vel is.

Az alábbi utasítások tartalmazzák a zajszűrési technikánkat (aluláteresztő Wiener szűrő), valamint a képküszöböt (a szürkeárnyalatos kép intenzitási hisztogramjának használatával) és morfológiai gradienst (a kép tágulása és eróziója közötti különbség) alkalmazva azonosítson egy érdekes régiót. Az utasítás ezután elmagyarázza, hogyan integráljuk az összes elemet a grafikus felhasználói felületbe (GUI).

Jegyzet:

1). Ezt a projektet egy kutatási cikk ihlette: "A kóros tüdők szegmentálása és képelemzése a CT -n: jelenlegi megközelítések, kihívások és jövőbeli tendenciák". Ami itt található

2). Az NIH: Clinical Center röntgenfelvételeit használjuk. Link megtalálható itt

3). Az alkalmazástervező súgója itt található

4). A kód futtatása előtt: módosítania kell a Dir elérési utat (a 34. sorban) a fájlkönyvtárra és a kép típusára (35. sor) (a *-p.webp

1. lépés: 1. lépés: Kép betöltése

1. lépés: Kép betöltése
1. lépés: Kép betöltése

Ez a lépés szürke skálán mutatja az eredeti képet. Változtassa meg a "name_of_picture.png" fájlt a kép nevére

egyértelmű; clc; minden bezárása;

%% Képek betöltése

raw_x_ray = 'kép_neve.png';

I = imread (raw_x_ray);

ábra (101);

imshow (I);

színtérkép (szürke);

cím („Szürkeárnyalatos röntgen”);

2. lépés: 2. lépés: Zajszűrés és hisztogram

2. lépés: Zajszűrés és hisztogram
2. lépés: Zajszűrés és hisztogram

Annak érdekében, hogy megtaláljuk a szürkeárnyalatos kép küszöbértékét, megvizsgáljuk a hisztogramot, hogy lássuk, különálló módok vannak -e. Bővebben itt olvashat

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

ábra (102);

részterület (2, 1, 1);

imshow (I);

részterület (2, 1, 2);

imhist (I, 256);

3. lépés: 3. lépés: A küszöbértékek beállítása

3. lépés: A küszöbértékek beállítása
3. lépés: A küszöbértékek beállítása
3. lépés: A küszöbértékek beállítása
3. lépés: A küszöbértékek beállítása

Ez a lépés lehetővé teszi a küszöb beállítását a hisztogramnak megfelelően. morfológiai A színátmenet vörös színnel fogja kiemelni az érdeklődési területet, és a függvény határai piros színnel borítják a tüdő körvonalazott és szűrt képét.

A regionprops használatával pontosíthatjuk a szilárdsági tömböket, és csökkenő sorrendbe rendezhetjük őket. Ezután binarizálom a szürke sclae képet, és alkalmazom a morfológiai gradiens módszert és mLoren Shurasking -ot, hogy kiemeljem az érdeklődési területet (ROI). A következő lépés a kép megfordítása, hogy a tüdő ROI fehér legyen a fekete háttérben. A showMaskAsOverlay funkciót használom a 2 maszk megjelenítésére. Megjegyzés: a kódot Loren Shure ihlette, link.

Lasly, piros körvonalat hozok létre a bwbwboundaries segítségével, és elfedem a szűrőképet és a határokat.

a_thresh = I> = 172; % beállította ezt a küszöböt

[labelImage, numberOfBlobs] = bwlabel (a_thresh);

kellékek = regionprops (a_thresh, 'all');

sortedSolidity = rendezés ([props. Solidity], 'descend');

SB = sortedSolidity (1);

ha SB == 1 % SB csak szilárdságot fogad el == 1 szűrje ki a csontokat

binaryImage = imbinarize (I); ábra (103);

imshow (binaryImage); színtérkép (szürke);

SE = strel ('négyzet', 3);

morfológiaiGradiens = imsubtract (imdilate (binaryImage, SE), imerode (binaryImage, SE));

maszk = imbinarize (morfológiaiGradiens, 0,03);

SE = strel ('négyzet', 2);

maszk = imclose (maszk, SE);

maszk = imfill (maszk, 'lyukak');

maszk = bwareafilt (maszk, 2); A terület megjelenítésének % ellenőrző száma

notMask = ~ maszk;

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

showMaskAsOverlay (0,5, maszk, 'r'); % le kell töltenie a showMaskAsOverlay alkalmazást/funkciót

BW2 = imfill (bináris kép, 'lyukak');

új_kép = BW2;

új_kép (~ maszk) = 0; % fordított háttér és lyukak

B = határvonalak (új_kép); A % csak 2 dimenziót tud elfogadni

ábra (104);

imshow (új_kép);

kitartás

határterületek (B);

vége

4. lépés: GUI létrehozása

Most integráljuk a korábbi kódot egy MATLAB alkalmazásba. Nyissa meg az App Designer alkalmazást a MATLAB -ban (Új> Alkalmazás). Először úgy tervezzük meg az interfészt, hogy kattintva tartjuk, és három tengelyt húzunk a középső munkaterületre. Ezután kattintsunk és tartsunk lenyomva két gombot, egy szerkesztési mezőt (szöveg), egy szerkesztési mezőt (numerikus), egy csúszkát és egy legördülő menüt. Mindkét tengely megjeleníti az előnézetet és elemzi a képet, a harmadik tengely pedig az előnézeti „kiválasztott” képhez tartozó képpontok hisztogramját. A szerkesztési mező (szöveg) mezőben a kiválasztott kép fájl elérési útja, a szerkesztési mezőben (numerikus) pedig a tüdő észlelt pixelterülete látható.

Most váltson tervezési nézetről kódnézetre az App Designer alkalmazásban. Írja be a kódot a tulajdonságok kódjához, kattintson a piros „Tulajdonságok” gombra, pluszjel mellett. Inicializálja az I tulajdonságokat, a küszöbértéket és a regionalToExtract tulajdonságokat az alábbi kód szerint. Ezután kattintson a jobb gombbal egy gombra a munkaterület jobb felső részén (az összetevő böngészőben), és lépjen a Visszahívások> Ugrás a… visszahívás menüpontra. Adja hozzá a kódot a „SelectImageButtonPushed funkcióhoz (alkalmazás, esemény)”. Ez a kód lehetővé teszi, hogy kiválasszon egy elemzendő képet a számítógépről az uigetfile használatával. A kép kiválasztása után egy előnézeti kép jelenik meg a tengelyek alatt hisztogram kíséretében. Ezután kattintson a jobb gombbal a másik gombra, és ismételje meg ugyanezt az eljárást a visszahívási funkció létrehozásához.

Adja hozzá a kódot az „AnalyzeImageButtonPushed (alkalmazás, esemény)” funkció alatt. Ez a kód elvégzi a képpontszámolást és a foltfelismerést az előnézeti képen a Kép elemzése gombon (attól függően, hogy melyikre kattintott a jobb gombbal). A gombok programozása után most a csúszkát és a legördülő menüt programozzuk. Kattintson a jobb gombbal a csúszkára, hozzon létre egy visszahívási funkciót, és a végéig írja be a „function FilterThresholdSliderValueChanged (app, event)” alatti kódot. Ez lehetővé teszi, hogy a csúszka beállítsa a szürke intenzitás küszöbértékét.

Hozzon létre egy visszahívási funkciót a legördülő menüben, és adja hozzá a kódot a „function AreastoExtractDropDownValueChanged (app, event)” alá, hogy a legördülő menü módosítsa az elemzett képtengelyeken megjelenő blobok számát. Most kattintson az egyes entitásokra a komponensböngészőben, és módosítsa tulajdonságait tetszés szerint, például módosítsa az entitások nevét, távolítsa el a tengelyeket és módosítsa a méretezést. Húzza át az elemeit a komponensböngészőben a Tervező nézetben egy funkcionális és könnyen érthető elrendezéshez. Most van egy alkalmazása a MATLAB -ban, amely elemezheti a tüdő képeit a pixelterület szempontjából!

tulajdonságok (Hozzáférés = privát) I = ; % Képfájl

küszöb = 257; %küszöb a szürke intenzitás binarizálásához

regionToExtract = 2;

vége

függvény SelectImageButtonPushed (alkalmazás, esemény)

clc; Dir = 'C: / Users / danie / Letöltések / images_004 / images'; %define invariate file "prefix"

[imageExt, elérési út] = uigetfile ('*. png'); %megragadja a képnév változó részét

imageName = [Fájlkezelés imageExt]; %összefűzött változatlan és változó szalagok

app. I = imread (képnév); %olvassa el a képet

imshow (kb. I., „szülő”, kb. UIAxes); %megjeleníti a képet

app. FilePathEditField. Value = elérési út; %eredeti fájl elérési útjának megjelenítése

vége

függvény AnalyzeImageButtonPushed (alkalmazás, esemény)

originalImage = kb. I;

originalImage = wiener2 (kb. I., [5 5]); %ponteltávolító szűrő

hisztogram (kb. tengelyekHistogram, kb. I, 256); %megjeleníti a kép hisztogramját

a_thresh = originalImage> = kb.küszöb; % beállította ezt a küszöböt

labelImage = bwlabel (a_thresh);

kellékek = regionprops (a_thresh, 'all');

sortedSolidity = rendezés ([props. Solidity], 'descend');

SB = sortedSolidity (1);

ha SB == 1 % SB csak szilárdságot fogad el == 1 szűrje ki a csontokat

SE = strel ('négyzet', 3);

morfológiaiGradiens = imsubtract (imdilate (labelImage, SE), imerode (labelImage, SE));

maszk = imbinarize (morfológiaiGradiens, 0,03);

SE = strel ('négyzet', 2);

maszk = imclose (maszk, SE);

maszk = imfill (maszk, 'lyukak');

maszk = bwareafilt (maszk, app.regionsToExtract);

A terület megjelenítésének % ellenőrző száma

notMask = ~ maszk;

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

BW2 = imfill (labelImage, 'hole');

új_kép = BW2;

új_kép (~ maszk) = 0;

B = határvonalak (új_kép); % csak 2 dimenziót tud elfogadni (új_kép, 'szülő', app. UIAxes2);

hold (kb. UIAxes2, 'be');

határterületek (B);

set (gca, 'YDir', 'fordított');

tüdőterület = bwarea (új_kép);

app. PixelAreaEditField. Value = lungArea;

vége

vége

függvény FilterThresholdSliderValueChanged (alkalmazás, esemény)

app.threshold = app. FilterThresholdSlider. Value;

vége

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

app.regionsToExtract = str2double (stringNumber);

vége

vége

Ajánlott: