Πίνακας περιεχομένων:

Κατάτμηση πνευμόνων MatLab: 5 βήματα
Κατάτμηση πνευμόνων MatLab: 5 βήματα

Βίντεο: Κατάτμηση πνευμόνων MatLab: 5 βήματα

Βίντεο: Κατάτμηση πνευμόνων MatLab: 5 βήματα
Βίντεο: ΕΙΚ. Επεξεργασία εικόνας και Radiomics 2024, Ιούνιος
Anonim
Τμηματοποίηση πνευμόνων MatLab
Τμηματοποίηση πνευμόνων MatLab

Από: Phuc Lam, Paul Yeung, Eric Reyes

Αναγνωρίζοντας ότι τα λάθη στην κατάτμηση των πνευμόνων θα παράγουν ψευδείς πληροφορίες σχετικά με τον εντοπισμό μιας περιοχής ασθένειας και μπορούν να επηρεάσουν άμεσα τη διαδικασία διάγνωσης. Οι σύγχρονες τεχνικές βοήθειας υπολογιστών απέτυχαν να δώσουν ακριβή αποτελέσματα όταν οι πνευμονικές παθήσεις έχουν προκλητικά σχήματα. Αυτά τα ανώμαλα σχήματα μπορεί να προκληθούν από υπεζωκοτικές συλλογές, ενοποιήσεις κ.λπ. Εφαρμόζοντας την τεχνική κατάτμησης των πνευμόνων, στην οποία τα όρια του πνεύμονα απομονώνονται από τον περιβάλλοντα θωρακικό ιστό, η εφαρμογή μας μπορεί να προσδιορίσει τα όρια με τα κατώφλια εισόδου του χρήστη για να δώσει πλήρως προσαρμόσιμες προβολές των σχημάτων των πνευμόνων, Ο σκοπός αυτού του έργου MatLab είναι να δημιουργήσει μια φιλική προς τον χρήστη διαδραστική εφαρμογή τμηματοποίησης των πνευμόνων για τον εντοπισμό παθολογικών καταστάσεων των ακτίνων Χ των πνευμόνων. Στόχος μας είναι να δημιουργήσουμε έναν πιο αποτελεσματικό τρόπο για την απεικόνιση και τον εντοπισμό των ανώμαλων πνευμόνων, προκειμένου να δώσουμε στους γιατρούς και τους ακτινολόγους έναν πιο αξιόπιστο τρόπο διάγνωσης των πνευμονικών παθήσεων. Χρησιμοποιώντας το εργαλείο σχεδιασμού εφαρμογών στο MatLab, το πρόγραμμα έχει σχεδιαστεί για να λειτουργεί ειδικά με ακτινογραφίες θώρακος και αξονική τομογραφία (CT), αλλά έχει επίσης δοκιμαστεί για εργασία με μαγνητικές τομογραφίες.

Οι παρακάτω οδηγίες περιέχουν την τεχνική φιλτραρίσματος θορύβου (φίλτρο Wiener χαμηλής διέλευσης) καθώς και το κατώφλι εικόνας (χρησιμοποιώντας ιστόγραμμα έντασης της εικόνας κλίμακας του γκρι) και χρησιμοποιώντας μορφολογική κλίση (η διαφορά μεταξύ της διαστολής και της διάβρωσης μιας εικόνας) προσδιορίζουν μια περιοχή ενδιαφέροντος. Στη συνέχεια, η οδηγία θα εξηγήσει πώς ενσωματώνουμε όλα τα στοιχεία στη γραφική διεπαφή χρήστη (GUI).

Σημείωση:

1). Αυτό το έργο είναι εμπνευσμένο από μια ερευνητική εργασία: "Segmentation and Image Analysis of Abnormal Lungs at CT: Current Approaches, Challenges, and Future Trends". Το οποίο μπορείτε να βρείτε εδώ

2). Χρησιμοποιούμε εικόνες ακτίνων Χ από το NIH: Clinical Center. Ο σύνδεσμος μπορεί να βρεθεί εδώ

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).

imhist (I, 256);

Βήμα 3: Βήμα 3: Ρύθμιση ορίων

Βήμα 3: Ρύθμιση ορίων
Βήμα 3: Ρύθμιση ορίων
Βήμα 3: Ρύθμιση ορίων
Βήμα 3: Ρύθμιση ορίων

Αυτό το βήμα σάς επιτρέπει να ορίσετε το κατώφλι σύμφωνα με το ιστόγραμμα. morphologicalGradient θα επισημάνει την περιοχή που μας ενδιαφέρει με κόκκινο χρώμα και η συνάρτηση visboundaries επικαλύπτει την περιγραμμένη και φιλτραρισμένη εικόνα του πνεύμονα με κόκκινο χρώμα.

Χρησιμοποιώντας τα τοπικά εργαλεία, μπορούμε να προσδιορίσουμε τις συστοιχίες στερεότητας και να τις ταξινομήσουμε σε φθίνουσα σειρά. Στη συνέχεια, υπογραμμίζω τη γκρι εικόνα του sclae και εφαρμόζω τη μέθοδο μορφολογικής κλίσης και το mLoren Shurasking για να τονίσω την περιοχή ενδιαφέροντος (ROI). Το επόμενο βήμα είναι η αντιστροφή της εικόνας, έτσι ώστε η απόδοση επένδυσης των πνευμόνων να είναι λευκή σε μαύρο φόντο. Χρησιμοποιώ τη λειτουργία showMaskAsOverlay για να εμφανίσω 2 μάσκες. Σημείωση: ο κώδικας είναι εμπνευσμένος από τον σύνδεσμο Loren Shure.

Lasly, δημιουργώ κόκκινο περίγραμμα χρησιμοποιώντας τα bwbwbounds και καλύπτοντας την εικόνα φίλτρου και τα όρια.

a_thresh = I> = 172; % ορίστε αυτό το όριο

[labelImage, numberOfBlobs] = bwlabel (a_thresh);

props = regionprops (a_thresh, 'all');

sortedSolidity = sort ([props. Solidity], 'κατέβασμα');

SB = sortedSolidity (1);

εάν SB == 1 % SB δέχεται μόνο σταθερότητα == 1 φιλτράρετε τα οστά

binaryImage = απενεργοποίηση (I); σχήμα (103)?

imshow (binaryImage); χρωματικός χάρτης (γκρι)?

SE = strel ("τετράγωνο", 3);

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

μάσκα = απενεργοποίηση (morphologicalGradient, 0,03);

SE = strel ("τετράγωνο", 2);

μάσκα = κλείνω (μάσκα, ΝΑ)

μάσκα = imfill (μάσκα, «τρύπες»);

μάσκα = bwareafilt (μάσκα, 2); % ελέγχου αριθμός εμφάνισης περιοχής

notMask = ~ μάσκα;

μάσκα = μάσκα | bwpropfilt (notMask, 'Area', [-Inf, 5000 - eps (5000)]);

showMaskAsOverlay (0,5, μάσκα, 'r'); % πρέπει να κατεβάσετε την εφαρμογή/λειτουργία showMaskAsOverlay

BW2 = imfill (binaryImage, 'hole');

new_image = BW2;

new_image (~ μάσκα) = 0; % αντιστροφή φόντου και οπών

B = bwboundsaries (new_image); % μπορεί να δεχτεί μόνο 2 διαστάσεις

σχήμα (104);

απεικόνιση (new_image);

περίμενε

visboundaries (Β);

τέλος

Βήμα 4: Δημιουργία GUI

Τώρα, ενσωματώνουμε τον προηγούμενο κώδικα σε μια εφαρμογή MATLAB. Ανοίξτε το App Designer στο MATLAB (Νέο> App). Αρχικά, σχεδιάζουμε τη διεπαφή κάνοντας κλικ-κράτημα-και σύροντας σε τρεις άξονες στον κεντρικό χώρο εργασίας. Στη συνέχεια, κάνουμε κλικ-κράτημα-σύρετε δύο κουμπιά, ένα πεδίο επεξεργασίας (κείμενο), ένα πεδίο επεξεργασίας (αριθμητικό), ένα ρυθμιστικό και ένα αναπτυσσόμενο μενού. Δύο άξονες θα εμφανίζουν ο καθένας την προεπισκόπηση και την ανάλυση της εικόνας και ο τρίτος άξονας θα εμφανίζει ένα ιστόγραμμα εικονοστοιχείων για την προεπιλεγμένη "επιλεγμένη" εικόνα. Το πλαίσιο πεδίου επεξεργασίας (κείμενο) θα εμφανίσει τη διαδρομή αρχείου της επιλεγμένης εικόνας και το πεδίο επεξεργασίας (αριθμητικό) θα εμφανίσει την εντοπισμένη περιοχή εικονοστοιχείων των πνευμόνων.

Τώρα μεταβείτε από την προβολή σχεδίασης σε προβολή κώδικα στο App Designer. Εισαγάγετε στον κωδικό τον κωδικό των ιδιοτήτων κάνοντας κλικ στο κόκκινο κουμπί "Ιδιότητες" με ένα σύμβολο συν από αυτό. Αρχικοποιήστε τις ιδιότητες I, κατώτατο όριο και περιοχέςToExtract όπως στον παρακάτω κώδικα. Στη συνέχεια, κάντε δεξί κλικ σε ένα κουμπί στην επάνω δεξιά πλευρά του χώρου εργασίας (το Πρόγραμμα περιήγησης στοιχείων) και μεταβείτε από τις Επιστροφές κλήσεων> Μετάβαση στην… επανάκληση. Προσθέστε τον κωδικό για "λειτουργία SelectImageButtonPushed (εφαρμογή, συμβάν)". Αυτός ο κώδικας σάς επιτρέπει να επιλέξετε μια εικόνα για ανάλυση από τον υπολογιστή σας χρησιμοποιώντας το uigetfile. Μετά την επιλογή μιας εικόνας, μια εικόνα προεπισκόπησης θα εμφανιστεί κάτω από τους άξονες συνοδευόμενη από ένα ιστόγραμμα. Στη συνέχεια, κάντε δεξί κλικ στο άλλο κουμπί και επαναλάβετε την ίδια διαδικασία για να δημιουργήσετε μια λειτουργία επανάκλησης.

Προσθέστε τον κώδικα κάτω από τη "λειτουργία AnalyzeImageButtonPushed (εφαρμογή, συμβάν)". Αυτός ο κώδικας θα εκτελέσει την καταμέτρηση των εικονοστοιχείων και την ανίχνευση σταγονιδίων στην εικόνα προεπισκόπησης στο κουμπί ανάλυσης εικόνας (όποιο έχετε κάνει δεξί κλικ για αυτόν τον κώδικα). Αφού προγραμματίσουμε τα κουμπιά, θα προγραμματίσουμε τώρα το ρυθμιστικό και το αναπτυσσόμενο μενού. Κάντε δεξί κλικ στο ρυθμιστικό, δημιουργήστε μια λειτουργία επανάκλησης και προσθέστε τον κώδικα κάτω από τη "λειτουργία FilterThresholdSliderValueChanged (εφαρμογή, συμβάν)" μέχρι το τέλος. Αυτό επιτρέπει στο ρυθμιστικό να ρυθμίζει το κατώφλι γκρι έντασης.

Δημιουργήστε μια λειτουργία επανάκλησης για το αναπτυσσόμενο μενού και προσθέστε τον κώδικα κάτω από τη "λειτουργία AreastoExtractDropDownValueChanged (εφαρμογή, συμβάν)" για να επιτρέψετε στο αναπτυσσόμενο μενού να τροποποιήσει τον αριθμό των σταυρών που εμφανίζονται στους αναλυμένους άξονες εικόνας. Τώρα, κάντε κλικ σε κάθε οντότητα στο πρόγραμμα περιήγησης Component και αλλάξτε τις ιδιότητες της αρεσκείας σας, όπως αλλαγή ονομάτων των οντοτήτων, κατάργηση αξόνων και αλλαγή κλίμακας. Μεταφέρετε και αποθέστε τις οντότητες του προγράμματος περιήγησης στοιχείων στο Design View σε μια λειτουργική και κατανοητή διάταξη. Τώρα έχετε μια εφαρμογή στο MATLAB που μπορεί να αναλύσει εικόνες πνευμόνων για την περιοχή pixel!

ιδιότητες (Πρόσβαση = ιδιωτικό) I = ; % αρχείο εικόνας

κατώφλι = 257; %κατώτατο όριο για δυαδικότητα γκρίζας έντασης

περιοχέςToExtract = 2;

τέλος

λειτουργία SelectImageButtonPushed (εφαρμογή, συμβάν)

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

[imageExt, path] = uigetfile ('*. png'); %πιάστε το μεταβλητό μέρος του ονόματος της εικόνας

imageName = [Dir filesep imageExt]; %concatenate αμετάβλητες και μεταβλητές χορδές

app. I = imread (imageName); %διαβάζει την εικόνα

imshow (app. I, «γονέας», app. UIAxes) %εμφανίζει την εικόνα

app. FilePathEditField. Value = διαδρομή; %εμφάνιση διαδρομής αρχείου από πού προήλθε η αρχική εικόνα

τέλος

λειτουργία AnalyzeImageButtonPushed (εφαρμογή, συμβάν)

originalImage = app. I;

originalImage = wiener2 (app. I, [5 5]); φίλτρο %αφαίρεσης κουκκίδων

ιστόγραμμα (app. AxesHistogram, app. I, 256). %εμφάνιση ιστόγραμμα εικόνας

a_thresh = originalImage> = app.threshold; % ορίστε αυτό το όριο

labelImage = bwlabel (a_thresh);

props = regionprops (a_thresh, 'all');

sortedSolidity = sort ([props. Solidity], 'κατέβασμα');

SB = sortedSolidity (1);

εάν SB == 1 % SB δέχεται μόνο σταθερότητα == 1 φιλτράρετε τα οστά

SE = strel ("τετράγωνο", 3);

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

μάσκα = απενεργοποίηση (morphologicalGradient, 0,03);

SE = strel ("τετράγωνο", 2);

μάσκα = κλείνω (μάσκα, ΝΑ);

μάσκα = imfill (μάσκα, «τρύπες»);

μάσκα = bwareafilt (μάσκα, app.regionsToExtract);

% ελέγχου αριθμός εμφάνισης περιοχής

notMask = ~ μάσκα;

μάσκα = μάσκα | bwpropfilt (notMask, 'Area', [-Inf, 5000 - eps (5000)]);

BW2 = imfill (labelImage, 'hole');

new_image = BW2;

new_image (~ μάσκα) = 0;

B = bwboundsaries (new_image); % μπορεί να αποδεχτεί μόνο 2 διαστάσεις imshow (new_image, "γονέας", app. UIAxes2);

κρατήστε πατημένο (app. UIAxes2, 'on');

visboundaries (Β);

σύνολο (gca, 'YDir', 'reverse');

lungArea = bwarea (new_image);

app. PixelAreaEditField. Value = lungArea;

τέλος

τέλος

λειτουργία FilterThresholdSliderValueChanged (εφαρμογή, συμβάν)

app.threshold = app. FilterThresholdSlider. Value;

τέλος

λειτουργία AreastoExtractDropDownValueChanged (εφαρμογή, συμβάν) stringNumber = app. AreastoExtractDropDown. Value;

app.regionsToExtract = str2double (stringNumber);

τέλος

τέλος

Συνιστάται: