Daftar Isi:

Segmentasi Paru-Paru MatLab: 5 Langkah
Segmentasi Paru-Paru MatLab: 5 Langkah

Video: Segmentasi Paru-Paru MatLab: 5 Langkah

Video: Segmentasi Paru-Paru MatLab: 5 Langkah
Video: Permintaan dan Interpretasi X-Ray Toraks (Paru) | Keterampilan Klinis | FK Unand 2024, November
Anonim
Segmentasi Paru-Paru MatLab
Segmentasi Paru-Paru MatLab

Oleh: Phuc Lam, Paul Yeung, Eric Reyes

Mengakui bahwa kesalahan dalam segmentasi paru-paru akan menghasilkan informasi yang salah mengenai identifikasi suatu area penyakit dan secara langsung dapat mempengaruhi proses diagnosis. Teknik bantuan komputer modern gagal memberikan hasil yang akurat ketika penyakit paru-paru memiliki bentuk yang menantang. Bentuk abnormal ini dapat disebabkan oleh efusi pleura, konsolidasi, dll. Menerapkan teknik segmentasi paru-paru, di mana batas paru-paru diisolasi dari jaringan toraks di sekitarnya, aplikasi kami dapat mengidentifikasi batas dengan ambang masukan pengguna untuk memberikan tampilan yang dapat disesuaikan sepenuhnya bentuk paru-paru, Tujuan dari proyek MatLab ini adalah untuk membuat aplikasi segmentasi paru interaktif yang mudah digunakan untuk mendeteksi kondisi patologis gambar sinar-X paru-paru. Tujuan kami adalah untuk menciptakan cara yang lebih efektif untuk mengilustrasikan dan mengidentifikasi paru-paru abnormal untuk memberi dokter dan ahli radiologi cara yang lebih andal untuk mendiagnosis penyakit paru-paru. Menggunakan alat perancang aplikasi di MatLab, program ini dirancang untuk bekerja secara khusus dengan pemindaian x-ray dada dan computed tomography (CT), tetapi juga diuji untuk bekerja dengan pemindaian MRI.

Petunjuk di bawah ini berisi teknik penyaringan kebisingan kami (filter Wiener low-pass) serta ambang batas gambar (dengan menggunakan histogram intensitas gambar skala abu-abu) dan menggunakan gradien morfologis (perbedaan antara dilatasi dan erosi gambar) untuk mengidentifikasi wilayah yang diminati. Instruksi kemudian akan menjelaskan bagaimana kita mengintegrasikan semua elemen ke dalam antarmuka pengguna grafis (GUI).

Catatan:

1). Proyek ini terinspirasi oleh makalah penelitian: "Segmentasi dan Analisis Gambar Paru-Paru Abnormal di CT: Pendekatan Saat Ini, Tantangan, dan Tren Masa Depan". Yang dapat ditemukan di sini

2). Kami menggunakan gambar sinar-X dari NIH: Clinical Center. Tautan dapat ditemukan di sini

3). Bantuan perancang aplikasi dapat ditemukan di sini

4). Sebelum menjalankan kode: Anda perlu mengubah jalur Dir (pada baris 34) ke direktori file Anda dan jenis gambar (baris 35) (kami menganalisis *.png).

Langkah 1: Langkah 1: Memuat Gambar

Langkah 1: Memuat Gambar
Langkah 1: Memuat Gambar

Langkah ini akan menampilkan gambar asli dalam skala abu-abu. Ubah 'name_of_picture.png' menjadi nama gambar Anda

jernih; kl; tutup semua;

%% Memuat gambar

raw_x_ray='name_of_picture.png';

saya=imread(raw_x_ray);

angka (101);

imshow(saya);

peta warna (abu-abu);

title('X-Ray Skala Abu-abu');

Langkah 2: Langkah 2: Penyaringan Kebisingan dan Histogram

Langkah 2: Penyaringan Kebisingan dan Histogram
Langkah 2: Penyaringan Kebisingan dan Histogram

Untuk menemukan ambang batas untuk gambar skala abu-abu, kami melihat histogram untuk melihat apakah ada mode yang berbeda. Baca selengkapnya disini

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

angka (102);

subplot(2, 1, 1);

imshow(saya);

subplot(2, 1, 2);

imhist(I, 256);

Langkah 3: Langkah 3: Menetapkan Ambang Batas

Langkah 3: Menetapkan Ambang Batas
Langkah 3: Menetapkan Ambang Batas
Langkah 3: Menetapkan Ambang Batas
Langkah 3: Menetapkan Ambang Batas

Langkah ini memungkinkan Anda untuk mengatur ambang batas sesuai dengan histogram. morphologicalGradient akan menyorot wilayah yang diinginkan dalam warna merah, dan fungsi visboundaries melapisi gambar paru-paru yang digariskan dan difilter dengan warna merah.

Dengan menggunakan regionprops, kita dapat menentukan susunan solidility dan mengurutkannya secara descending. Selanjutnya saya binarize gambar sclae abu-abu dan menerapkan metode gradien morfologis dan mLoren Shurasking untuk menyorot region of interest (ROI). Langkah selanjutnya adalah membalikkan gambar sehingga ROI paru-paru berwarna putih di latar belakang hitam. Saya menggunakan fungsi showMaskAsOverlay untuk menampilkan 2 topeng. Catatan: kode ini terinspirasi dari Loren Shure, tautan.

Terakhir, saya membuat garis merah dengan menggunakan batas bwbw dan menutupi gambar filter dan batas.

a_thresh = I >= 172; % tetapkan ambang ini

[labelImage, numberOfBlobs] = bwlabel(a_thresh);

props = regionprops(a_thresh, 'semua');

sortirSolidity = sort([props. Solidity], 'turun');

SB = diurutkan Soliditas(1);

jika SB == 1% SB hanya menerima soliditas == 1 menyaring tulang

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

imshow(gambar biner); peta warna (abu-abu);

SE = strel('persegi', 3);

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

mask = imbinarize(morphologicalGradient, 0.03);

SE = strel('persegi', 2);

topeng = tutup(topeng, SE);

mask = imfill(masker, 'lubang');

topeng = bwareafilt(topeng, 2); % nomor kontrol pertunjukan area

notMask = ~mask;

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

showMaskAsOverlay(0.5, topeng, 'r'); % Anda harus mengunduh aplikasi/fungsi showMaskAsOverlay

BW2 = imfill(binaryImage, 'lubang');

gambar_baru = BW2;

gambar_baru(~topeng) = 0; % membalikkan latar belakang dan lubang

B=bwboundaries(new_image); % hanya dapat menerima 2 dimensi

angka (104);

imshow(gambar_baru);

tunggu

visboundaries (B);

akhir

Langkah 4: Membuat GUI

Sekarang, kami mengintegrasikan kode sebelumnya ke dalam aplikasi MATLAB. Buka Perancang Aplikasi di MATLAB (Baru > Aplikasi). Pertama, kami mendesain antarmuka dengan mengklik-tahan-dan menyeret tiga sumbu ke ruang kerja tengah. Selanjutnya, kita klik-tahan-tarik dua tombol, satu bidang edit (teks), satu bidang edit (numerik), satu slider, dan satu menu drop-down. Dua sumbu masing-masing akan menampilkan pratinjau dan menganalisis gambar, dan sumbu ketiga akan menampilkan histogram piksel untuk gambar "terpilih" pratinjau. Kolom edit (teks) akan menampilkan jalur file dari gambar yang dipilih, dan kolom edit (numerik) akan menampilkan area piksel yang terdeteksi pada paru-paru.

Sekarang beralih dari tampilan desain ke tampilan kode di App Designer. Masukkan kode untuk properti dengan mengklik tombol merah "Properti" dengan tanda plus di sampingnya. Inisialisasi properti I, threshold, dan regionToExtract seperti pada kode yang disediakan di bawah ini. Selanjutnya, klik kanan tombol di sisi kanan atas ruang kerja (Browser Komponen) dan pergi dari Callbacks>Go to… callback. Tambahkan kode untuk "fungsi SelectImageButtonPushed (aplikasi, acara)." Kode ini memungkinkan Anda untuk memilih gambar untuk dianalisis dari komputer Anda menggunakan uigetfile. Setelah memilih gambar, gambar pratinjau akan muncul di bawah sumbu disertai dengan histogram. Kemudian, klik kanan tombol lainnya dan ulangi prosedur yang sama untuk membuat fungsi panggilan balik.

Tambahkan kode di bawah "fungsi AnalyzeImageButtonPushed (aplikasi, acara)." Kode ini akan melakukan penghitungan piksel dan deteksi gumpalan pada gambar pratinjau pada tombol analisis gambar (mana pun yang Anda klik kanan untuk kode ini). Setelah memprogram tombol, sekarang kita akan memprogram penggeser dan menu tarik-turun. Klik kanan penggeser, buat fungsi panggilan balik dan tambahkan kode di bawah "fungsi FilterThresholdSliderValueChanged(aplikasi, acara)" hingga akhir. Ini memungkinkan penggeser untuk menyesuaikan ambang batas intensitas abu-abu.

Buat fungsi panggilan balik untuk menu tarik-turun, dan tambahkan kode di bawah "fungsi AreastoExtractDropDownValueChanged(aplikasi, peristiwa)" untuk memungkinkan menu tarik-turun mengubah jumlah gumpalan yang ditampilkan pada sumbu gambar yang dianalisis. Sekarang, klik setiap entitas di Component Browser dan ubah propertinya sesuai keinginan Anda, seperti mengubah nama entitas, menghapus sumbu, dan mengubah penskalaan. Seret dan lepas entitas Component Browser dalam Design View ke tata letak yang fungsional dan mudah dipahami. Anda sekarang memiliki aplikasi di MATLAB yang dapat menganalisis gambar paru-paru untuk area piksel!

properti (Akses = pribadi)I = ; % file gambar

ambang = 257; %ambang batas untuk binarisasi intensitas abu-abu

regionToExtract = 2;

akhir

fungsi SelectImageButtonPushed (aplikasi, acara)

clc;Dir = 'C:\Users\danie\Downloads\images_004\images'; %define file invariat "awalan"

[imageExt, jalur] = uigetfile('*.png'); %ambil bagian variabel dari nama gambar

imageName = [Dir filessep imageExt]; %menggabungkan strain invariat dan variabel

app. I = imread(namagambar); %membaca gambarnya

imshow(app. I, 'parent', app. UIAxes); %tampilkan gambar

app. FilePathEditField. Value = jalur; %tampilkan jalur file dari mana gambar asli berasal

akhir

fungsi AnalyzeImageButtonPushed (aplikasi, acara)

originalImage = app. I;

originalImage = wiener2(app. I, [5 5]); %filter penghilang titik

histogram(app. AxesHistogram, app. I, 256); %tampilkan histogram gambar

a_thresh = originalImage >= app.threshold; % tetapkan ambang ini

labelImage = bwlabel(a_thresh);

props = regionprops(a_thresh, 'semua');

sortirSolidity = sort([props. Solidity], 'turun');

SB = terurut Soliditas(1);

jika SB == 1% SB hanya menerima soliditas == menyaring tulang

SE = strel('persegi', 3);

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

mask = imbinarize(morphologicalGradient, 0.03);

SE = strel('persegi', 2);

topeng = tutup(topeng, SE);

mask = imfill(masker, 'lubang');

topeng = bwareafilt(topeng, app.regionsToExtract);

% jumlah kontrol area pertunjukan

notMask = ~mask;

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

BW2 = imfill(labelImage, 'lubang');

gambar_baru = BW2;

gambar_baru(~topeng) = 0;

B = bwboundaries(gambar_baru); % hanya dapat menerima 2 dimensi imshow(new_image, 'parent', app. UIAxes2);

tahan(app. UIAxes2, 'on');

visboundaries (B);

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

lungArea = bwarea(gambar_baru);

app. PixelAreaEditField. Value = lungArea;

akhir

akhir

fungsi FilterThresholdSliderValueChanged (aplikasi, acara)

app.threshold = app. FilterThresholdSlider. Value;

akhir

function AreastoExtractDropDownValueChanged(app, event)stringNumber = app. AreastoExtractDropDown. Value;

app.regionsToExtract = str2double(stringNumber);

akhir

akhir

Direkomendasikan: