Talaan ng mga Nilalaman:

MatLab Lung Segmentation: 5 Hakbang
MatLab Lung Segmentation: 5 Hakbang

Video: MatLab Lung Segmentation: 5 Hakbang

Video: MatLab Lung Segmentation: 5 Hakbang
Video: How to Make Serious Money Importing Goods from Thailand | Export Import Business 2024, Nobyembre
Anonim
MatLab Lung Segmentation
MatLab Lung Segmentation

Ni: Phuc Lam, Paul Yeung, Eric Reyes

Ang pagkilala na ang mga pagkakamali sa paghihiwalay ng baga ay magbubunga ng maling impormasyon tungkol sa pagkilala sa isang lugar ng sakit at maaaring direktang makakaapekto sa proseso ng pagsusuri. Nabigo ang mga modernong diskarte sa tulong ng computer na makapaghatid ng tumpak na mga resulta kapag ang mga sakit sa baga ay mayroong mapaghamong mga hugis. Ang mga abnormal na hugis na ito ay maaaring sanhi ng pleural effusions, consolidations, atbp. Ang paglalapat ng diskarte sa paghihiwalay ng baga, kung saan ang mga hangganan ng baga ay nakahiwalay mula sa nakapalibot na thoracic tissue, maaaring kilalanin ng aming app ang mga hangganan sa mga input threshold ng gumagamit upang magbigay ng ganap na napapasadyang mga view ng mga hugis ng baga, Ang layunin ng proyektong ito ng MatLab ay upang lumikha ng isang madaling gamitin na interactive na paghihiwalay ng baga app upang matukoy ang mga kondisyon ng pathologic ng mga imahe ng X-ray ng baga. Ang aming hangarin ay upang lumikha ng isang mas mabisang paraan upang ilarawan at makilala ang mga hindi normal na baga upang mabigyan ang mga doktor at radiologist ng isang mas maaasahang paraan upang masuri ang mga sakit sa baga. Gamit ang tool ng taga-disenyo ng app sa MatLab, ang programa ay idinisenyo upang gumana nang partikular sa chest x-ray at compute tomography (CT) na mga pag-scan, ngunit nasubukan din ito upang gumana sa mga pag-scan ng MRI.

Ang mga tagubilin sa ibaba ay naglalaman ng aming diskarte sa pag-filter ng ingay (low-pass Wiener filter) pati na rin ang threshold ng imahe (sa pamamagitan ng paggamit ng intensity histogram ng grayscale na imahe) at paggamit ng isang morphological gradient (ang pagkakaiba sa pagitan ng pagluwang at pagguho ng isang imahe) upang kilalanin ang isang rehiyon ng interes. Ipapaliwanag ng tagubilin kung paano namin isinasama ang lahat ng mga elemento sa graphic user interface (GUI).

Tandaan:

1). Ang proyektong ito ay binigyang inspirasyon ng isang papel sa pagsasaliksik: "Paghihiwalay at Pagtatasa ng Imahe ng Mga Karaniwang Baga sa CT: Mga Kasalukuyang Diskarte, Hamon, at Mga Uso sa Hinaharap". Alin ang matatagpuan dito

2). Gumagamit kami ng mga imahe ng X-ray mula sa NIH: Clinical Center. Ang link ay matatagpuan dito

3). Ang tulong ng taga-disenyo ng app ay matatagpuan dito

4). Bago patakbuhin ang code: kailangan mong baguhin ang Dir path (sa linya 34) sa iyong direktoryo ng file at uri ng imahe (linya 35) (pinag-aaralan namin ang *.png).

Hakbang 1: Hakbang 1: Naglo-load ng Larawan

Hakbang 1: Naglo-load ng Larawan
Hakbang 1: Naglo-load ng Larawan

Ipapakita sa iyo ng hakbang na ito ang orihinal na larawan sa grey scale. Palitan ang 'name_of_picture.png' sa iyong pangalan ng imahe

malinaw; clc; isara ang lahat;

%% Naglo-load ng mga imahe

raw_x_ray = 'name_of_picture.png';

I = imread (raw_x_ray);

pigura (101);

imshow (I);

colormap (grey);

pamagat ('Grayscale X-Ray');

Hakbang 2: Hakbang 2: Pagsala ng Noise at Histogram

Hakbang 2: Pagsala ng Noise at Histogram
Hakbang 2: Pagsala ng Noise at Histogram

Upang makahanap ng threshold para sa kulay-abo na imahe ng scale, tinitingnan namin ang histogram upang makita kung ang isang natatanging mga mode. Magbasa pa dito

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

pigura (102);

subplot (2, 1, 1);

imshow (I);

subplot (2, 1, 2);

imhist (I, 256);

Hakbang 3: Hakbang 3: Pagtatakda ng Mga Threshold

Hakbang 3: Pagtatakda ng Mga Threshold
Hakbang 3: Pagtatakda ng Mga Threshold
Hakbang 3: Pagtatakda ng Mga Threshold
Hakbang 3: Pagtatakda ng Mga Threshold

Pinapayagan ka ng hakbang na ito na itakda ang threshold ayon sa histogram. ang morphologicalGradient ay i-highlight ang rehiyon ng interes sa pula, at ang function visboundaries ay overlay ng nakabalangkas at nai-filter na imahe ng baga sa pula.

Sa pamamagitan ng paggamit ng mga regionprops, maaari nating makuha ang mga arrays ng solidity at pag-uri-uriin ang mga ito sa pababang. Susunod ay binari ko ang imahe ng grey sclae at inilapat ang morphlogical gradient na pamamaraan at mLoren Shurasking upang i-highlight ang rehiyon ng interes (ROI). Ang susunod na hakbang ay upang baligtarin ang imahe kaya ang baga ROI ay puti sa itim na background. Ginagamit ko ang function na showMaskAsOverlay upang ipakita ang 2 mask. Tandaan: ang code ay inspirasyon mula sa Loren Shure, link.

Lasly, lumilikha ako ng pulang balangkas sa pamamagitan ng paggamit ng mga bwbwboundaries at masking ang imahe ng filter at ang mga hangganan.

a_thresh = I> = 172; % itakda ang threshold na ito

[labelImage, numberOfBlobs] = bwlabel (a_thresh);

props = regionprops (a_thresh, 'lahat');

pinagsunod-sunodSolidity = pag-uuri ([props. Solidity], 'pagbaba');

SB = pinagsunod-sunodSolidity (1);

kung ang SB == 1% SB ay tumatanggap lamang ng solidity == 1 mag-filter ng mga buto

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

imshow (binaryImage); colormap (grey);

SE = strel ('square', 3);

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

mask = imbinarize (morphologicalGradient, 0.03);

SE = strel ('square', 2);

mask = imclose (mask, SE);

mask = imfill (maskara, 'hole');

mask = bwareafilt (mask, 2); % control number ng area show

notMask = ~ maskara;

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

showMaskAsOverlay (0.5, mask, 'r'); % kailangan mong mag-download ng app / function na showMaskAsOverlay

BW2 = imfill (binaryImage, 'hole');

new_image = BW2;

new_image (~ mask) = 0; % baligtarin ang background at mga butas

B = bwboundaries (bagong_image); 2 na sukat lamang ang matatanggap ni%

pigura (104);

imshow (bagong_image);

hawakan mo

visboundaries (B);

magtapos

Hakbang 4: Lumilikha ng GUI

Ngayon, isinasama namin ang naunang code sa isang MATLAB app. Buksan ang App Designer sa MATLAB (Bago> App). Una, dinisenyo namin ang interface sa pamamagitan ng pag-click-hold-at pag-drag sa tatlong palakol sa gitna ng workspace. Susunod, nag-click-hold-drag kami ng dalawang mga pindutan, isang patlang ng pag-edit (teksto), isang patlang ng pag-edit (bilang), isang slider, at isang drop-down na menu. Dalawang palakol ay ipapakita ang bawat preview at susuriin ang imahe, at ang pangatlong palakol ay magpapakita ng isang histogram ng mga pixel para sa preview na "napiling" imahe. Ipapakita ng kahon ng patlang ng pag-edit (teksto) ang file path ng napiling imahe, at ang patlang ng pag-edit (numeric) ay ipapakita ang natukoy na pixel area ng baga.

Lumipat ngayon mula sa view ng disenyo sa view ng code sa App Designer. Ipasok sa code ang code para sa mga pag-aari sa pamamagitan ng pag-click sa pulang pindutang "Mga Katangian" na may plus sign sa tabi nito. Pinasimulan ang mga pag-aari na I, threshold, at mga rehiyonToExtract tulad ng sa code na ibinigay sa ibaba. Susunod, mag-right click sa isang pindutan sa kanang itaas na kanang bahagi ng workspace (ang Component Browser) at pumunta mula sa Mga Callback> Pumunta sa… callback. Idagdag ang code para sa "function SelectImage ButtonPush (app, kaganapan)." Pinapayagan ka ng code na ito na pumili ng isang imahe upang pag-aralan mula sa iyong computer gamit ang uigetfile. Matapos pumili ng isang imahe, lilitaw ang isang preview na imahe sa ilalim ng mga palakol na sinamahan ng isang histogram. Pagkatapos, i-right click ang iba pang pindutan at ulitin ang parehong pamamaraan upang lumikha ng isang function ng callback.

Idagdag sa code sa ilalim ng "function AnalyzeImage ButtonPush (app, kaganapan)." Gagawa ng code na ito ang pagbibilang ng pixel at pagtuklas ng blob sa preview ng imahe sa pag-aralan ang pindutan ng imahe (alinman sa na-click nang tama para sa code na ito). Matapos ma-program ang mga pindutan, ipaprograma namin ngayon ang slider at ang drop-down na menu. Mag-right click sa slider, lumikha ng isang function ng callback at idagdag sa code sa ilalim ng "function FilterThresholdSliderValueChanged (app, kaganapan)" hanggang sa katapusan. Pinapayagan nito ang slider na ayusin ang grey-intensity threshold.

Lumikha ng isang function ng callback para sa drop down menu, at idagdag sa code sa ilalim ng "function AreastoExtractDropDownValueChanged (app, kaganapan)" upang payagan ang drop down na menu upang mabago ang bilang ng mga patak na ipinapakita sa pinag-aralan na mga axis ng imahe. Ngayon, i-click ang bawat nilalang sa Component Browser at baguhin ang kanilang mga pag-aari ayon sa gusto mo, tulad ng pagbabago ng mga pangalan ng mga entity, pag-aalis ng mga palakol, at pagbabago ng pag-scale. I-drag at i-drop ang mga entity ng Component Browser sa View ng Disenyo sa isang layout na may pag-andar at madaling maunawaan. Mayroon ka na ngayong isang app sa MATLAB na maaaring pag-aralan ang mga imahe ng baga para sa pixel area!

mga pag-aari (Access = pribado) I = ; % dokumentong Larawan

threshold = 257; % threshold para sa binarizing grey intensity

mga rehiyonToExtract = 2;

magtapos

pagpapaandar SelectImage ButtonPush (app, kaganapan)

clc; Dir = 'C: / Users / danie / Downloads / images_004 / images'; % tukuyin ang invariate file na "pref"

[imageExt, path] = uigetfile ('*. png'); % grab ang variable na bahagi ng pangalan ng imahe

imageName = [Dir filesep imageExt]; % concatenate nakaka-engganyo at variable variable

app. I = imread (imageName); % basahin ang imahe

imshow (app. I, 'magulang', app. UIAxes); % ipakita ang imahe

app. FilePathEditField. Value = path; % display path ng file kung saan nagmula ang orihinal na imahe

magtapos

pag-andar AnalyzeImage ButtonPush (app, kaganapan)

originalImage = app. I;

originalImage = wiener2 (app. I, [5 5]); % filter ng pagtanggal ng tuldok

histogram (app. AxesHistogram, app. I, 256); % ipakita ang histogram ng imahe

a_thresh = originalImage> = app.threshold; % itakda ang threshold na ito

labelImage = bwlabel (a_thresh);

props = regionprops (a_thresh, 'lahat');

pinagsunod-sunodSolidity = pag-uuri ([props. Solidity], 'pagbaba');

SB = pinagsunod-sunodSolidity (1);

kung ang SB == 1% SB ay tumatanggap lamang ng solidity == 1 mag-filter ng mga buto

SE = strel ('square', 3);

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

mask = imbinarize (morphologicalGradient, 0.03);

SE = strel ('square', 2);

mask = imclose (mask, SE);

mask = imfill (maskara, 'hole');

mask = bwareafilt (mask, app.regionsToExtract);

% control number ng area show

notMask = ~ maskara;

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

BW2 = imfill (labelImage, 'hole');

new_image = BW2;

new_image (~ mask) = 0;

B = bwboundaries (bagong_image); Maaari lamang tanggapin ni% ang 2 dimshow imshow (new_image, 'parent', app. UIAxes2);

hawakan (app. UIAxes2, 'on');

visboundaries (B);

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

lungArea = bwarea (new_image);

app. PixelAreaEditField. Value = lungArea;

magtapos

magtapos

pag-andar FilterThresholdSliderValueChanged (app, kaganapan)

app.threshold = app. FilterThresholdSlider. Value;

magtapos

pagpapaandar AreastoExtractDropDownValueChanged (app, kaganapan) stringNumber = app. AreastoExtractDropDown. Value;

app.regionsToExtract = str2double (stringNumber);

magtapos

magtapos

Inirerekumendang: