Obsah:

Segmentace plic MatLab: 5 kroků
Segmentace plic MatLab: 5 kroků

Video: Segmentace plic MatLab: 5 kroků

Video: Segmentace plic MatLab: 5 kroků
Video: CS50 2014 - Week 3 2024, Červen
Anonim
Segmentace plic MatLab
Segmentace plic MatLab

Autor: Phuc Lam, Paul Yeung, Eric Reyes

Uvědomte si, že chyby v segmentaci plic vytvoří nepravdivé informace týkající se identifikace oblasti onemocnění a mohou přímo ovlivnit proces diagnostiky. Moderní techniky počítačové pomoci nepřinesly přesné výsledky, pokud mají plicní nemoci náročné tvary. Tyto abnormální tvary mohou být způsobeny pleurálními výpotky, konsolidacemi atd. Pomocí techniky segmentace plic, při které jsou hranice plic izolovány od okolní hrudní tkáně, dokáže naše aplikace identifikovat hranice s prahovými hodnotami vstupu uživatele a poskytnout plně přizpůsobitelné zobrazení. tvarů plic, Účelem tohoto projektu MatLab je vytvořit uživatelsky přívětivou interaktivní aplikaci segmentace plic pro detekci patologických stavů rentgenových snímků plic. Naším cílem je vytvořit účinnější způsob, jak ilustrovat a identifikovat abnormální plíce, aby lékaři a radiologům poskytli spolehlivější způsob diagnostiky plicních chorob. Pomocí nástroje pro návrháře aplikací v programu MatLab je program navržen tak, aby fungoval specificky s rentgeny hrudníku a počítačovou tomografií (CT), ale je také testován pro práci se skenováním MRI.

Níže uvedené pokyny obsahují naši techniku filtrování šumu (nízkoprůchodový Wienerův filtr) a také práh obrazu (pomocí histogramu intenzity obrazu ve stupních šedi) a použití morfologického gradientu (rozdíl mezi dilatací a erozí obrazu) pro identifikovat oblast zájmu. Instrukce pak vysvětlí, jak integrujeme všechny prvky do grafického uživatelského rozhraní (GUI).

Poznámka:

1). Tento projekt je inspirován výzkumnou prací: „Segmentace a obrazová analýza abnormálních plic na CT: současné přístupy, výzvy a budoucí trendy“. Což najdete zde

2). Používáme rentgenové snímky z NIH: Clinical Center. Odkaz najdete zde

3). Nápovědu pro návrháře aplikací najdete zde

4). Před spuštěním kódu: musíte změnit cestu Dir (v řádku 34) na adresář souborů a typ obrázku (řádek 35) (analyzujeme *.png).

Krok 1: Krok 1: Načítání obrázku

Krok 1: Načítání obrázku
Krok 1: Načítání obrázku

Tento krok vám ukáže původní obrázek v šedé škále. Změňte 'name_of_picture.png' na název obrázku

Průhledná; clc; zavřít vše;

%% načítání obrázků

raw_x_ray = 'name_of_picture.png';

I = imread (raw_x_ray);

obrázek (101);

imshow (I);

barevná mapa (šedá);

title ('X-Ray ve stupních šedi');

Krok 2: Krok 2: Filtrování šumu a histogram

Krok 2: Filtrování šumu a histogram
Krok 2: Filtrování šumu a histogram

Abychom našli prahovou hodnotu obrázku šedé stupnice, podíváme se do histogramu, abychom zjistili, zda existují odlišné režimy. Přečtěte si více zde

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

obrázek (102);

podkres (2, 1, 1);

imshow (I);

podkres (2, 1, 2);

imhist (I, 256);

Krok 3: Krok 3: Nastavení prahových hodnot

Krok 3: Nastavení prahových hodnot
Krok 3: Nastavení prahových hodnot
Krok 3: Nastavení prahových hodnot
Krok 3: Nastavení prahových hodnot

Tento krok vám umožňuje nastavit práh podle histogramu. morphologicalGradient zvýrazní oblast zájmu červeně a funkce visboundaries překrývá načrtnutý a filtrovaný obraz plic červeně.

Použitím regionprops můžeme upřesnit pole solidnosti a seřadit je sestupně. Dále binarizuji obraz šedých sclae a použiji metodu morfologického gradientu a mLoren Shurasking pro zvýraznění oblasti zájmu (ROI). Dalším krokem je převrácení obrázku tak, aby návratnost plic byla na černém pozadí bílá. K zobrazení 2 masky používám funkci showMaskAsOverlay. Poznámka: kód je inspirován Loren Shure, odkaz.

Lasly, vytvořím červený obrys pomocí bwbwboundaries a maskování obrazu filtru a hranic.

a_thresh = I> = 172; % nastavilo tuto prahovou hodnotu

[labelImage, numberOfBlobs] = bwlabel (a_thresh);

props = regionprops (a_thresh, 'all');

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

SB = seřazenáSolidity (1);

pokud SB == 1 % SB akceptuje pouze pevnost == 1 odfiltruje kosti

binaryImage = imbinarize (I); obrázek (103);

imshow (binaryImage); barevná mapa (šedá);

SE = strel ('čtverec', 3);

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

maska = imbinarize (morphologicalGradient, 0,03);

SE = strel ('čtverec', 2);

maska = imclose (maska, SE);

mask = imfill (maska, 'díry');

maska = bwareafilt (maska, 2); % kontrolní počet plošné show

notMask = ~ maska;

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

showMaskAsOverlay (0,5, maska, 'r'); % musíte si stáhnout aplikaci/funkci showMaskAsOverlay

BW2 = imfill (binaryImage, 'díry');

new_image = BW2;

new_image (~ maska) = 0; % invertovat pozadí a díry

B = hranice hranice (nový_obraz); % může přijmout pouze 2 dimenze

obrázek (104);

imshow (new_image);

vydrž

hranice (B);

konec

Krok 4: Vytvoření GUI

Nyní integrujeme předchozí kód do aplikace MATLAB. Otevřete App Designer v MATLABu (New> App). Nejprve navrhneme rozhraní kliknutím a podržením a přetažením ve třech osách do středového pracovního prostoru. Dále klikneme, podržíme a přetáhneme dvě tlačítka, jedno editační pole (text), jedno editační pole (číselné), jeden posuvník a jednu rozevírací nabídku. Dvě osy zobrazí náhled a analyzují obrázek a třetí osy zobrazí histogram pixelů pro náhled „vybraného“obrázku. Pole pro úpravy (text) zobrazí cestu k souboru vybraného obrázku a pole pro úpravy (číselné) zobrazí detekovanou pixelovou oblast plic.

Nyní přepněte z návrhového zobrazení do zobrazení kódu v App Designer. Zadejte do kódu kód vlastností kliknutím na červené tlačítko „Vlastnosti“se znaménkem plus. Inicializujte vlastnosti I, práh a regionToExtract jako v níže uvedeném kódu. Dále klikněte pravým tlačítkem na tlačítko v pravé horní části pracovního prostoru (Prohlížeč komponent) a přejděte z Zpětná volání> Přejít na … zpětné volání. Přidejte kód pro „funkci SelectImageButtonPushed (aplikace, událost)“. Tento kód vám umožňuje vybrat obrázek, který chcete analyzovat, z počítače pomocí uigetfile. Po výběru obrázku se pod osami zobrazí náhledový obrázek doprovázený histogramem. Poté klepněte pravým tlačítkem na druhé tlačítko a opakujte stejný postup pro vytvoření funkce zpětného volání.

Přidejte kód pod „funkce AnalyzeImageButtonPushed (aplikace, událost)“. Tento kód provede počítání pixelů a detekci blobů na náhledovém obrázku po tlačítku analyzovat obrázek (na kterýkoli z nich jste u tohoto kódu klikli pravým tlačítkem). Po naprogramování tlačítek nyní naprogramujeme posuvník a rozevírací nabídku. Klikněte pravým tlačítkem na posuvník, vytvořte funkci zpětného volání a přidejte kód pod „funkce FilterThresholdSliderValueChanged (aplikace, událost)“až do konce. To umožňuje posuvníku upravit práh intenzity šedé.

Vytvořte funkci zpětného volání pro rozevírací nabídku a přidejte kód pod „funkce AreastoExtractDropDownValueChanged (aplikace, událost)“, aby rozbalovací nabídka umožnila upravit počet blobů zobrazených na osách analyzovaného obrázku. Nyní klikněte na každou entitu v Prohlížeči součástí a změňte její vlastnosti podle svých představ, například změňte názvy entit, odeberte osy a změňte měřítko. Přetáhněte entity prohlížeče komponent v návrhovém zobrazení na funkční a snadno srozumitelné rozložení. Nyní máte v MATLABu aplikaci, která dokáže analyzovat snímky plic pro pixelovou oblast!

vlastnosti (Přístup = soukromé) I = ; % soubor obrázku

práh = 257; %prahové hodnoty pro binarizaci intenzity šedé

regionToExtract = 2;

konec

funkce SelectImageButtonPushed (aplikace, událost)

clc; Dir = 'C: / Users / danie / Downloads / images_004 / images'; %definovat "prefix" invariate souboru

[imageExt, cesta] = uigetfile ('*. png'); %uchopte proměnnou část názvu obrázku

imageName = [Dir filesep imageExt]; %zřetězit invariate a variabilní řetězce

app. I = imread (imageName); %přečíst obrázek

imshow (app. I, 'parent', app. UIAxes); %zobrazení obrázku

app. FilePathEditField. Value = cesta; %cesta k zobrazení souboru, odkud pochází původní obrázek

konec

funkce AnalyzeImageButtonPushed (aplikace, událost)

originalImage = app. I;

originalImage = wiener2 (app. I, [5 5]); %filtr pro odstranění teček

histogram (app. AxesHistogram, app. I, 256); %zobrazení histogramu obrázku

a_thresh = originalImage> = app.threshold; % nastavilo tuto prahovou hodnotu

labelImage = bwlabel (a_thresh);

props = regionprops (a_thresh, 'all');

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

SB = seřazenáSolidity (1);

pokud SB == 1 % SB akceptuje pouze pevnost == 1 odfiltruje kosti

SE = strel ('čtverec', 3);

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

maska = imbinarize (morphologicalGradient, 0,03);

SE = strel ('čtverec', 2);

maska = imclose (maska, SE);

mask = imfill (maska, 'díry');

maska = bwareafilt (maska, app.regionsToExtract);

% kontrolní počet plošné show

notMask = ~ maska;

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

BW2 = imfill (labelImage, 'díry');

new_image = BW2;

new_image (~ maska) = 0;

B = hranice hranice (nový_obraz); % může akceptovat pouze 2 dimenze imshow (new_image, 'parent', app. UIAxes2);

hold (app. UIAxes2, 'on');

hranice (B);

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

lungArea = bwarea (new_image);

app. PixelAreaEditField. Value = plicní plocha;

konec

konec

funkce FilterThresholdSliderValueChanged (aplikace, událost)

app.threshold = app. FilterThresholdSlider. Value;

konec

funkce AreastoExtractDropDownValueChanged (aplikace, událost) stringNumber = app. AreastoExtractDropDown. Value;

app.regionsToExtract = str2double (stringNumber);

konec

konec

Doporučuje: