Orodha ya maudhui:

Ugawaji wa Mapafu ya MatLab: Hatua 5
Ugawaji wa Mapafu ya MatLab: Hatua 5

Video: Ugawaji wa Mapafu ya MatLab: Hatua 5

Video: Ugawaji wa Mapafu ya MatLab: Hatua 5
Video: Virtual Wellness Class: Gentle Exercises While Laying Down 2024, Novemba
Anonim
Sehemu ya Mapafu ya MatLab
Sehemu ya Mapafu ya MatLab

Na: Phuc Lam, Paul Yeung, Eric Reyes

Kukubali kuwa makosa katika sehemu ya mapafu yatatoa habari ya uwongo juu ya utambuzi wa eneo la ugonjwa na inaweza kuathiri moja kwa moja mchakato wa utambuzi. Mbinu za kisasa za msaada wa kompyuta zilishindwa kutoa matokeo sahihi wakati magonjwa ya mapafu yana maumbo yenye changamoto. Maumbo haya yasiyo ya kawaida yanaweza kusababishwa na athari za kuambatana, ujumuishaji, n.k Kutumia mbinu ya kugawanya mapafu, ambayo mipaka ya mapafu imetengwa na tishu zinazozunguka za kifua, programu yetu inaweza kutambua mipaka na vizingiti vya pembejeo vya mtumiaji ili kutoa maoni yanayoweza kubadilishwa kikamilifu ya maumbo ya mapafu, Madhumuni ya mradi huu wa MatLab ni kuunda programu ya kugawanya mapafu inayoweza kutumiwa na mtumiaji ili kugundua hali ya ugonjwa wa picha za X-ray za mapafu. Lengo letu ni kuunda njia bora zaidi ya kuonyesha na kutambua mapafu yasiyo ya kawaida ili kuwapa madaktari na wataalamu wa radiolojia njia ya kuaminika zaidi ya kugundua magonjwa ya mapafu. Kutumia zana ya mtengenezaji wa programu katika MatLab, programu hiyo imeundwa kufanya kazi haswa na eksirei ya kifua na skanati za kompyuta za kompyuta (CT), lakini pia inajaribiwa kufanya kazi na skan za MRI.

Maagizo hapa chini yana mbinu yetu ya kuchuja kelele (kichujio cha chini cha Wiener) pamoja na kizingiti cha picha (kwa kutumia histogram ya kiwango cha picha ya kijivu) na kutumia gradient ya morpholojia (tofauti kati ya upanuzi na mmomonyoko wa picha) kwa tambua mkoa unaovutia. Maagizo kisha yataelezea jinsi tunavyounganisha vitu vyote kwenye kiolesura cha mtumiaji wa picha (GUI).

Kumbuka:

1). Mradi huu umeongozwa na jarida la utafiti: "Ugawaji na Uchambuzi wa Picha ya Mapafu yasiyo ya kawaida huko CT: Njia za Sasa, Changamoto, na Mwelekeo wa Baadaye". Ambayo inaweza kupatikana hapa

2). Tunatumia picha za X-ray kutoka NIH: Kituo cha Kliniki. Kiungo kinaweza kupatikana hapa

3). Msaada wa mbuni wa programu unaweza kupatikana hapa

4). Kabla ya kutumia nambari: unahitaji kubadilisha njia ya Dir (katika mstari wa 34) hadi saraka yako ya faili na aina ya picha (mstari wa 35) (tunachambua *.png).

Hatua ya 1: Hatua ya 1: Inapakia Picha

Hatua ya 1: Inapakia Picha
Hatua ya 1: Inapakia Picha

Hatua hii itakuonyesha picha ya asili kwa kiwango cha kijivu. Badilisha 'jina_ la_picha.png' na jina la picha yako

wazi; clc; funga zote;

%% Inapakia picha

raw_x_ray = 'jina_ la_picha.png';

I = soma (ghafi_x_ray);

takwimu (101);

onyesha (I);

colormap (kijivu);

kichwa ('Grayscale X-Ray');

Hatua ya 2: Hatua ya 2: Kuchuja kelele na Histogram

Hatua ya 2: Kuchuja kelele na Histogram
Hatua ya 2: Kuchuja kelele na Histogram

Ili kupata kizingiti cha picha ya kijivu, tunaangalia histogram ili kuona ikiwa kuna njia tofauti. Soma zaidi hapa

Mimi = wiener2 (mimi, [5 5]);

takwimu (102);

sehemu ndogo (2, 1, 1);

onyesha (I);

sehemu ndogo (2, 1, 2);

imhistia (I, 256);

Hatua ya 3: Hatua ya 3: Kuweka Vizingiti

Hatua ya 3: Kuweka Vizingiti
Hatua ya 3: Kuweka Vizingiti
Hatua ya 3: Kuweka Vizingiti
Hatua ya 3: Kuweka Vizingiti

Hatua hii hukuruhusu kuweka kizingiti kulingana na histogram. MorphologicalGradient itaangazia mkoa wa kupendeza kwa nyekundu, na vielelezo vya kazi hufunika picha iliyoonyeshwa na iliyochujwa ya mapafu kwenye nyekundu.

Kwa kutumia viunga vya mkoa, tunaweza kusawazisha safu za uthabiti na kuzipanga kwa kushuka. Ifuatayo ninaweka picha ya sclae kijivu na utumie njia ya upendeleo wa morphlogical na mLoren Shurasking kuonyesha mkoa wa riba (ROI). Hatua inayofuata ni kugeuza picha ili ROI ya mapafu iwe nyeupe kwenye asili nyeusi. Ninatumia showMaskAsOverlay ya kazi kuonyesha 2 mask. Kumbuka: nambari imeongozwa kutoka kwa Loren Shure, kiunga.

Lasly, ninaunda muhtasari mwekundu kwa kutumia mipaka ya bwb na kufunika picha ya kichungi na mipaka.

a_thresh = I> = 172; % weka kizingiti hiki

[labelImage, numberOfBlobs] = bwlabel (a_thresh);

props = kanda ya mkoa (a_thresh, 'all');

IliyopangwaSolidity = aina ([props. Solidity], 'shuka');

SB = Iliyopangwa Ukali (1);

ikiwa SB == 1% SB inakubali tu uthabiti == 1 chuja mifupa

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

imshow (binaryImage); colormap (kijivu);

SE = safu ('mraba', 3);

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

mask = imbinarize (morphologicalGradient, 0.03);

SE = safu ('mraba', 2);

mask = imclose (mask, SE);

mask = kujaza (mask, 'mashimo');

mask = bwareafilt (mask, 2); Idadi ya udhibiti wa onyesho la eneo

notMask = ~ kinyago;

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

onyeshaMaskAsOverlay (0.5, mask, 'r'); % lazima upakue programu / kazi showMaskAsOverlay

BW2 = kujaza (binaryImage, 'mashimo');

picha mpya = BW2;

picha mpya (~ mask) = 0; % geuza nyuma na mashimo

B = mipaka (picha mpya); % inaweza kukubali vipimo 2 tu

takwimu (104);

imshow (picha mpya);

subiri

mipaka (B);

mwisho

Hatua ya 4: Kuunda GUI

Sasa, tunaunganisha nambari ya awali kwenye programu ya MATLAB. Fungua Mbuni wa App katika MATLAB (Mpya> App). Kwanza, tunabuni kiolesura kwa kubofya-kushikilia-na kuvuta shoka tatu kwenye nafasi ya kazi ya kituo. Ifuatayo, tunabofya-kushikilia-buruta vifungo viwili, uwanja mmoja wa kuhariri (maandishi), uwanja mmoja wa kuhariri (nambari), kitelezi kimoja, na menyu moja ya kushuka. Shoka mbili kila moja itaonyesha hakikisho na kuchambua picha, na shoka za tatu zitaonyesha histogram ya saizi kwa picha ya hakikisho "iliyochaguliwa". Sehemu ya kuhariri (maandishi) itaonyesha njia ya faili ya picha iliyochaguliwa, na uwanja wa kuhariri (nambari) utaonyesha eneo la pikseli lililogunduliwa la mapafu.

Sasa badilisha kutoka kwa mtazamo wa muundo kuwa mtazamo wa nambari katika Mbuni wa App. Ingiza msimbo nambari ya mali kwa kubofya kitufe nyekundu cha "Mali" na ishara ya kuongeza nayo. Anzisha mali mimi, kizingiti, na mikoaToExtract kama ilivyo kwenye nambari iliyotolewa hapa chini. Ifuatayo, bonyeza kitufe cha kulia upande wa juu wa kulia wa nafasi ya kazi (Kivinjari cha Sehemu) na uende kutoka kwa Callbacks> Nenda kwa… callback. Ongeza nambari ya "kazi SelectImageButtonPushed (programu, tukio)." Nambari hii hukuruhusu kuchagua picha ya kuchambua kutoka kwa kompyuta yako kwa kutumia uigetfile. Baada ya kuchagua picha, picha ya hakikisho itaonekana chini ya shoka ikifuatana na histogram. Kisha, bonyeza-bonyeza kitufe kingine na urudia utaratibu huo huo ili kuunda kazi ya kupiga tena simu.

Ongeza kwenye nambari chini ya "kazi AnalyzeImageButtonPushed (programu, tukio)." Nambari hii itafanya uhesabuji wa pikseli na kugundua blob kwenye picha ya hakikisho kwenye kitufe cha kuchambua picha (yoyote ambayo umebofya kulia kwa nambari hii). Baada ya kupanga vifungo, sasa tutapanga slider na menyu ya kushuka. Bonyeza kulia kitelezi, unda kazi ya kupiga tena simu na ongeza nambari iliyo chini ya "kazi FilterThresholdSliderValueChanged (programu, tukio)" hadi mwisho. Hii inaruhusu kitelezi kurekebisha kizingiti cha kiwango cha kijivu.

Unda kazi ya kupiga tena simu kwa menyu kunjuzi, na ongeza kwenye nambari iliyo chini ya "kazi AreastoExtractDropDownValueChanged (programu, tukio)" kuruhusu menyu ya kushuka kurekebisha idadi ya matone yaliyoonyeshwa kwenye shoka za picha zilizochanganuliwa. Sasa, bofya kila kitu kwenye Kivinjari cha Vipengele na ubadilishe mali zao upendavyo, kama vile kubadilisha majina ya vyombo, kuondoa shoka, na kubadilisha kuongezeka. Buruta na uangushe vyombo vya Kivinjari cha Vipengee katika Muonekano wa Kubuni kwa mpangilio wa kazi na rahisi kuelewa. Sasa una programu katika MATLAB inayoweza kuchambua picha za mapafu kwa eneo la pikseli!

mali (Ufikiaji = faragha) I = ; Picha ya faili

kizingiti = 257; % ya kizingiti cha kupunguza nguvu ya kijivu

mikoaToExtract = 2;

mwisho

kazi SelectImageButtonPushed (programu, tukio)

clc; Dir = 'C: / Watumiaji / danie / Upakuaji / picha_004 / picha'; % fafanua kiambishi cha faili "kiambishi awali"

[ImageExt, path] = uigetfile ('*. png'); % shika sehemu inayobadilika ya jina la picha

imageName = [Dir filesep imageExt]; % concatenate shida na mabadiliko yanayobadilika

programu. I = imread (imageName); soma picha

imshow (programu. I, 'mzazi', programu. UIAxes); % Onyesha picha

programu. FilePathEditField. Value = njia; % onyesha njia ya faili ambapo picha asili ilitoka

mwisho

kazi ChambuaImageButtonPushed (programu, tukio)

awaliImage = programu. I;

awaliImage = wiener2 (programu. I, [5 5]); Kichujio cha kuondoa nukta%

histogram (programu. AxesHistogram, programu. I, 256); % onyesha histogram ya picha

a_thresh = originalImage> = app.bado; % weka kizingiti hiki

leboImage = bwlabel (a_thresh);

props = kanda ya mkoa (a_thresh, 'all');

IliyopangwaSolidity = aina ([props. Solidity], 'shuka');

SB = Iliyopangwa Ukali (1);

ikiwa SB == 1% SB inakubali tu uthabiti == 1 chuja mifupa

SE = safu ('mraba', 3);

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

mask = imbinarize (morphologicalGradient, 0.03);

SE = safu ('mraba', 2);

mask = imclose (mask, SE);

mask = kujaza (mask, 'mashimo');

mask = bwareafilt (mask, app.regionsToExtract);

Idadi ya kudhibiti eneo la onyesho la eneo

notMask = ~ kinyago;

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

BW2 = kujaza (lebo ya picha, 'mashimo');

picha mpya = BW2;

picha mpya (~ mask) = 0;

B = mipaka (picha mpya); % inaweza tu kukubali vipimo 2 imshow (new_image, 'parent', app. UIAxes2);

shikilia (app. UIAxes2, 'on');

mipaka (B);

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

lungArea = bwarea (picha mpya);

programu. PixelAreaEditField. Value = lungArea;

mwisho

mwisho

kazi FilterThresholdSliderValueChanged (programu, tukio)

app.threshold = app. FilterThresholdSlider. Uthamini;

mwisho

kazi AreastoExtractDropDownValueChanged (programu, tukio) stringNumber = app. AreastoExtractDropDown. Value;

app.regionsToExtract = str2double (stringNumber);

mwisho

mwisho

Ilipendekeza: