Სარჩევი:

MatLab ფილტვის სეგმენტირება: 5 ნაბიჯი
MatLab ფილტვის სეგმენტირება: 5 ნაბიჯი

ვიდეო: MatLab ფილტვის სეგმენტირება: 5 ნაბიჯი

ვიდეო: MatLab ფილტვის სეგმენტირება: 5 ნაბიჯი
ვიდეო: Pneumonia Explained 2024, ივნისი
Anonim
ფილმების ფილმის სეგმენტირება MatLab
ფილმების ფილმის სეგმენტირება MatLab

ავტორები: ფუკ ლამი, პოლ იონგი, ერიკ რეიესი

იმის აღიარება, რომ ფილტვების სეგმენტაციის შეცდომები გამოიწვევს ცრუ ინფორმაციას დაავადების არეალის იდენტიფიკაციის შესახებ და შეიძლება პირდაპირ იმოქმედოს დიაგნოზის პროცესზე. კომპიუტერული დახმარების თანამედროვე ტექნიკამ ვერ მიაღწია ზუსტ შედეგებს, როდესაც ფილტვის დაავადებებს აქვთ რთული ფორმები. ეს არანორმალური ფორმები შეიძლება გამოწვეული იყოს პლევრის გამონაყარით, კონსოლიდაციით და ა.შ. ფილტვების სეგმენტაციის ტექნიკის გამოყენებით, რომლის დროსაც ფილტვის საზღვრები იზოლირებულია გულმკერდის მიმდებარე ქსოვილისგან, ჩვენს აპს შეუძლია განსაზღვროს მომხმარებლის საზღვრები, რათა უზრუნველყოს სრულად კონფიგურირებადი ხედები. ფილტვების ფორმები, ამ MatLab პროექტის მიზანია შექმნას ფილტვების სეგმენტირების მოსახერხებელი აპლიკაცია ფილტვების რენტგენის სურათების პათოლოგიური მდგომარეობის გამოსავლენად. ჩვენი მიზანია შევქმნათ უფრო ეფექტური გზა არანორმალური ფილტვების ილუსტრაციისა და იდენტიფიცირების მიზნით, რათა ექიმებს და რადიოლოგებს მივცეთ უფრო საიმედო გზა ფილტვის დაავადებების დიაგნოსტიკისთვის. აპლიკაციის დიზაინერის ინსტრუმენტის გამოყენებით MatLab– ში, პროგრამა შექმნილია სპეციალურად გულმკერდის რენტგენის და კომპიუტერული ტომოგრაფიის (CT) სკანირებისთვის, მაგრამ ის ასევე გამოცდილია MRI– სთან მუშაობისთვის.

ქვემოთ მოცემული ინსტრუქციები შეიცავს ხმაურის გაფილტვრის ჩვენს ტექნიკას (დაბალგამტარი Wiener ფილტრი), ასევე გამოსახულების ზღურბლს (ნაცრისფერი მასშტაბის გამოსახულების ინტენსივობის ჰისტოგრამის გამოყენებით) და მორფოლოგიური გრადიენტის გამოყენებით (განსხვავება გამოსახულების გაფართოებასა და ეროზიას შორის) დაადგინეთ საინტერესო რეგიონი. შემდეგ ინსტრუქცია განმარტავს, თუ როგორ ვაერთიანებთ ყველა ელემენტს გრაფიკულ ინტერფეისში (GUI).

Შენიშვნა:

1). ეს პროექტი შთაგონებულია კვლევითი ნაშრომით: "პათოლოგიური ფილტვების სეგმენტირება და გამოსახულების ანალიზი CT- ში: მიმდინარე მიდგომები, გამოწვევები და მომავალი ტენდენციები". რაც აქ შეგიძლიათ ნახოთ

2). ჩვენ ვიყენებთ რენტგენის სურათებს NIH: კლინიკური ცენტრიდან. ბმული შეგიძლიათ იხილოთ აქ

3). აპლიკაციის დიზაინერის დახმარება შეგიძლიათ იხილოთ აქ

4). კოდის გაშვებამდე: თქვენ უნდა შეცვალოთ Dir გზა (სტრიქონი 34) თქვენი ფაილების დირექტორიაში და სურათის ტიპი (სტრიქონი 35) (ჩვენ ვაანალიზებთ *.png).

ნაბიჯი 1: ნაბიჯი 1: სურათის ჩატვირთვა

ნაბიჯი 1: სურათის ჩატვირთვა
ნაბიჯი 1: სურათის ჩატვირთვა

ეს ნაბიჯი გაჩვენებთ ორიგინალურ სურათს ნაცრისფერი მასშტაბით. შეცვალეთ 'name_of_picture.png' თქვენი სურათის სახელით

ნათელია; clc; დახურე ყველა;

%% იტვირთება სურათები

raw_x_ray = 'name_of_picture.png';

I = imread (raw_x_ray);

ფიგურა (101);

imshow (I);

ფერადი რუკა (ნაცრისფერი);

სათაური ("რუხი ფერის რენტგენი");

ნაბიჯი 2: ნაბიჯი 2: ხმაურის ფილტრაცია და ჰისტოგრამა

ნაბიჯი 2: ხმაურის გაფილტვრა და ჰისტოგრამა
ნაბიჯი 2: ხმაურის გაფილტვრა და ჰისტოგრამა

ნაცრისფერი მასშტაბის გამოსახულების ზღურბლის მოსაძებნად, ჩვენ ვუყურებთ ჰისტოგრამას, რათა დავინახოთ, არის თუ არა განსხვავებული რეჟიმი. დაწვრილებით აქ

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

ფიგურა (102);

ქვეპლოტი (2, 1, 1);

imshow (I);

ქვეპლოტი (2, 1, 2);

იმჰისტი (I, 256);

ნაბიჯი 3: ნაბიჯი 3: ზღურბლების დაყენება

ნაბიჯი 3: ზღურბლების დაყენება
ნაბიჯი 3: ზღურბლების დაყენება
ნაბიჯი 3: ზღურბლების დაყენება
ნაბიჯი 3: ზღურბლების დაყენება

ეს ნაბიჯი საშუალებას გაძლევთ დააყენოთ ბარიერი ჰისტოგრამის მიხედვით. მორფოლოგიური გრადიენტი ხაზს უსვამს წითელი რეგიონის ინტერესს და ფუნქცია visboundaries გადაფარავს ფილტვის გამოკვეთილ და გაფილტრულ სურათს წითლად.

რეგიონული პროგრამების გამოყენებით, ჩვენ შეგვიძლია გამოვყოთ სიმტკიცის მასივები და დავალაგოთ ისინი ქვევით. შემდეგ მე ბინარიზაციას ვუკეთებ ნაცრისფერი სკალის გამოსახულებას და ვიყენებ მორფლოგიურ გრადიენტის მეთოდს და ლორენ შურასკინგს ინტერესის რეგიონის (ROI) ხაზგასასმელად. შემდეგი ნაბიჯი არის სურათის გადაბრუნება ისე, რომ ფილტვების ROI იყოს თეთრი შავ ფონზე. მე ვიყენებ ფუნქციას showMaskAsOverlay 2 ნიღბის საჩვენებლად. შენიშვნა: კოდი შთაგონებულია ლორენ შურისგან, ბმული.

ლაზურად, მე ვქმნი წითელ კონტურს bwbwboundaries გამოყენებით და ვიფარებ ფილტრის სურათს და საზღვრებს.

a_thresh = I> = 172; % -მა დააყენა ეს ბარიერი

[labelImage, numberOfBlobs] = bwlabel (a_thresh);

props = regionprops (a_thresh, 'all');

sortedSolidity = დახარისხება ([props. Solidity], 'descend');

SB = დახარისხებული სიმტკიცე (1);

თუ SB == 1 % SB იღებს მხოლოდ სიმტკიცეს == 1 ძვლის გაფილტვრა

binaryImage = imbinarize (I); ფიგურა (103);

imshow (ორობითი გამოსახულება); ფერადი რუკა (ნაცრისფერი);

SE = strel ('კვადრატი', 3);

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

ნიღაბი = იმბინარიზაცია (მორფოლოგიური გრადიენტი, 0.03);

SE = strel ('კვადრატი', 2);

ნიღაბი = დახურვა (ნიღაბი, SE);

ნიღაბი = შევსება (ნიღაბი, 'ხვრელები');

ნიღაბი = bwareafilt (ნიღაბი, 2); ტერიტორიის ჩვენების % კონტროლის რაოდენობა

notMask = ~ ნიღაბი;

ნიღაბი = ნიღაბი | bwpropfilt (არა ნიღაბი, 'ფართობი', [-Inf, 5000 - eps (5000)]);

showMaskAsOverlay (0.5, ნიღაბი, 'r'); თქვენ უნდა ჩამოტვირთოთ აპლიკაცია/ფუნქცია showMaskAsOverlay

BW2 = imfill (ორობითი სურათი, "ხვრელები");

new_image = BW2;

new_image (~ ნიღაბი) = 0; ინვერსიული ფონი და ხვრელები

B = bwboundsounds (new_image); % -ს შეუძლია მიიღოს მხოლოდ 2 განზომილება

ფიგურა (104);

imshow (new_image);

შეჩერდი

visboundaries (B);

დასასრული

ნაბიჯი 4: შექმენით GUI

ახლა ჩვენ ინტეგრირებთ წინა კოდს MATLAB აპლიკაციაში. გახსენით აპლიკაციის დიზაინერი MATLAB– ში (ახალი> აპლიკაცია). პირველ რიგში, ჩვენ ვამუშავებთ ინტერფეისს დაჭერით-დაჭერით და სამი ღერძით გადაათრიეთ ცენტრის სამუშაო სივრცეში. შემდეგი, ჩვენ ვაწკაპუნებთ-ვჭიმავთ-ვწევთ ორ ღილაკს, ერთ რედაქტირების ველს (ტექსტს), ერთ რედაქტირების ველს (რიცხვით), ერთ სლაიდერს და ერთ ჩამოსაშლელ მენიუს. ორი ღერძი თითოეულ მათგანს აჩვენებს გადახედვას და აანალიზებს სურათს, ხოლო მესამე ღერძი აჩვენებს პიქსელების ჰისტოგრამას გადახედვისას "შერჩეული" სურათისთვის. რედაქტირების ველი (ტექსტი) ყუთი აჩვენებს არჩეული სურათის ფაილის გზას, ხოლო რედაქტირების ველი (რიცხვითი) აჩვენებს ფილტვების აღმოჩენილ პიქსელის არეს.

ახლა გადადით დიზაინის ხედიდან კოდის ხედზე აპლიკაციის დიზაინერში. შეიყვანეთ კოდი თვისებების კოდი, წითელი ღილაკით "თვისებები" დაჭერით, რომელსაც აქვს პლიუს ნიშანი. ინიციალიზაცია I, ბარიერი და regionToExtract თვისებები, როგორც ქვემოთ მოყვანილი კოდი. შემდეგი, დააწკაპუნეთ მარჯვენა ღილაკით სამუშაო სივრცის ზედა მარჯვენა მხარეს (კომპონენტის ბრაუზერი) და გადადით Callbacks> Go to… callback. დაამატეთ კოდი "ფუნქციის SelectImageButtonPushed (აპლიკაცია, მოვლენა)". ეს კოდი გაძლევთ საშუალებას აირჩიოთ სურათი თქვენი კომპიუტერის გასაანალიზებლად uigetfile– ის გამოყენებით. სურათის არჩევის შემდეგ, გადახედვის სურათი გამოჩნდება ღერძების ქვეშ, რომელსაც თან ახლავს ჰისტოგრამა. შემდეგ, დააწკაპუნეთ მარჯვენა ღილაკით სხვა ღილაკზე და გაიმეორეთ იგივე პროცედურა, რათა შეიქმნას უკუკავშირის ფუნქცია.

დაამატეთ კოდი "ფუნქცია AnalyzeImageButtonPushed (აპლიკაცია, მოვლენა)". ეს კოდი შეასრულებს პიქსელების დათვლას და ბლოკების გამოვლენას გადახედვისას სურათზე გაანალიზებული სურათის ღილაკზე (რომელზეც თქვენ დააწკაპუნეთ მარჯვენა ღილაკით ამ კოდზე). ღილაკების დაპროგრამების შემდეგ, ჩვენ ახლა დავპროგრამებთ სლაიდერს და ჩამოსაშლელ მენიუს. მარჯვენა ღილაკით დააწკაპუნეთ სლაიდერზე, შექმენით გამოძახების ფუნქცია და დაამატეთ კოდი "ფუნქციის FilterThresholdSliderValueChanged (აპლიკაცია, მოვლენა)" ბოლომდე. ეს საშუალებას აძლევს სლაიდერს შეცვალოს ნაცრისფერი ინტენსივობის ბარიერი.

ჩამოსაშლელი მენიუსთვის შექმენით უკუკავშირის ფუნქცია და დაამატეთ კოდი "ფუნქცია AreastoExtractDropDownValueChanged (აპლიკაცია, მოვლენა)" ქვევით, რათა ჩამოსაშლელ მენიუს შეეძლოს შეცვალოს გაანალიზებული სურათის ღერძებზე გამოსახული ბუშტუკების რაოდენობა. ახლა დააწკაპუნეთ კომპონენტის ბრაუზერის თითოეულ ერთეულზე და შეცვალეთ მათი თვისებები თქვენი სურვილისამებრ, როგორიცაა ერთეულების სახელების შეცვლა, ღერძების ამოღება და მასშტაბის შეცვლა. გადაიტანეთ და ჩამოყარეთ კომპონენტის ბრაუზერის ერთეულები დიზაინის ხედში ფუნქციურ და ადვილად გასაგებ განლაგებაზე. ახლა თქვენ გაქვთ აპლიკაცია MATLAB– ში, რომელსაც შეუძლია გაანალიზოს ფილტვების გამოსახულებები პიქსელის არეზე!

თვისებები (წვდომა = პირადი) I = ; % გამოსახულების ფაილი

ბარიერი = 257; %ბარიერი ნაცრისფერი ინტენსივობის ბინარიზაციისთვის

regionToExtract = 2;

დასასრული

ფუნქცია SelectImageButtonPushed (აპლიკაცია, მოვლენა)

clc; Dir = 'C: / Users / danie / ჩამოტვირთვები / images_004 / images'; %define invariate ფაილი "პრეფიქსი"

[imageExt, path] = uigetfile ('*. png'); %აითვისებს სურათის სახელის ცვლად ნაწილს

imageName = [Dir filesep imageExt]; შეუთავსებელი უცვლელი და ცვლადი სტრიქონები

app. I = imread (imageName); %წაიკითხა სურათი

imshow (აპლიკაცია I., „მშობელი“, აპლიკაცია. UIAxes); %გამოსახულების ჩვენება

app. FilePathEditField. Value = გზა; %ფაილის ფაილის ჩვენება, საიდანაც მოვიდა ორიგინალური სურათი

დასასრული

ფუნქცია AnalyzeImageButtonPushed (აპლიკაცია, მოვლენა)

originalImage = app. I;

originalImage = wiener2 (აპლიკაცია I., [5 5]); %წერტილების მოცილების ფილტრი

ჰისტოგრამა (აპი. აქსესტოგრამა, აპლიკაცია I, 256); %გამოსახულების ჰისტოგრამა

a_thresh = originalImage> = app.threshold; % -მა დააყენა ეს ბარიერი

labelImage = bwlabel (a_thresh);

props = regionprops (a_thresh, 'all');

sortedSolidity = დახარისხება ([props. Solidity], 'descend');

SB = დახარისხებული სიმტკიცე (1);

თუ SB == 1 % SB იღებს მხოლოდ სიმტკიცეს == 1 ძვლის გაფილტვრა

SE = strel ('კვადრატი', 3);

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

ნიღაბი = იმბინარიზაცია (მორფოლოგიური გრადიენტი, 0.03);

SE = strel ('კვადრატი', 2);

ნიღაბი = დახურვა (ნიღაბი, SE);

ნიღაბი = შევსება (ნიღაბი, 'ხვრელები');

mask = bwareafilt (mask, app.regionsToExtract);

ტერიტორიის ჩვენების % კონტროლის რაოდენობა

notMask = ~ ნიღაბი;

ნიღაბი = ნიღაბი | bwpropfilt (არა ნიღაბი, 'ფართობი', [-Inf, 5000 - eps (5000)]);

BW2 = შევსება (labelImage, 'ხვრელები');

new_image = BW2;

new_image (~ ნიღაბი) = 0;

B = bwboundsaries (new_image); % -ს შეუძლია მიიღოს მხოლოდ 2 განზომილება imshow (new_image, 'parent', app. UIAxes2);

გამართვა (აპლიკაცია. UIAxes2, 'ჩართული');

visboundaries (B);

კომპლექტი (gca, 'YDir', 'reverse');

lungArea = bwarea (ახალი_სახე);

app. PixelAreaEditField. Value = ფილტვის არე;

დასასრული

დასასრული

ფუნქცია FilterThresholdSliderValueChanged (აპლიკაცია, ღონისძიება)

app.threshold = app. FilterThresholdSlider. Value;

დასასრული

ფუნქცია AreastoExtractDropDownValueChanged (აპლიკაცია, მოვლენა) stringNumber = app. AreastoExtractDropDown. Value;

app.regionsToExtract = str2double (stringNumber);

დასასრული

დასასრული

გირჩევთ: