Isi kandungan:

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

Video: Segmentasi Paru MatLab: 5 Langkah

Video: Segmentasi Paru MatLab: 5 Langkah
Video: Pengolahan Segmentasi Citra (Matlab) 2024, Jun
Anonim
Segmentasi Paru MatLab
Segmentasi Paru MatLab

Oleh: Phuc Lam, Paul Yeung, Eric Reyes

Menyedari bahawa kesalahan dalam segmentasi paru-paru akan menghasilkan maklumat palsu mengenai pengenalan kawasan penyakit dan secara langsung boleh mempengaruhi proses diagnosis. Teknik bantuan komputer moden gagal memberikan hasil yang tepat apabila penyakit paru-paru mempunyai bentuk yang mencabar. Bentuk yang tidak normal ini boleh disebabkan oleh efusi pleura, penyatuan, dll. Menggunakan teknik segmentasi paru-paru, di mana batas paru-paru diasingkan dari tisu toraks sekitarnya, aplikasi kita dapat mengenal pasti batas dengan ambang input pengguna untuk memberikan pandangan yang dapat disesuaikan sepenuhnya. bentuk paru-paru, Tujuan projek MatLab ini adalah untuk membuat aplikasi segmentasi paru-paru interaktif yang mesra pengguna untuk mengesan keadaan patologi gambar sinar-X paru-paru. Tujuan kami adalah untuk mencipta kaedah yang lebih berkesan untuk menggambarkan dan mengenal pasti paru-paru yang tidak normal untuk memberi doktor dan ahli radiologi cara yang lebih dipercayai untuk mendiagnosis penyakit paru-paru. Dengan menggunakan alat pereka aplikasi di MatLab, program ini dirancang untuk bekerja secara khusus dengan imbasan sinar-x dada dan tomografi terkomputer (CT), tetapi juga diuji untuk berfungsi dengan imbasan MRI.

Arahan di bawah ini mengandungi teknik penapisan bunyi kami (penapis Wiener lulus rendah) serta ambang gambar (dengan menggunakan histogram intensiti gambar skala kelabu) dan menggunakan kecerunan morfologi (perbezaan antara pelebaran dan hakisan gambar) hingga mengenal pasti kawasan yang menarik. Arahan tersebut kemudian akan menjelaskan bagaimana kita menggabungkan semua elemen ke dalam antara muka pengguna grafik (GUI).

Catatan:

1). Projek ini diilhamkan oleh makalah penyelidikan: "Segmentasi dan Analisis Imej Paru-paru Tidak normal di CT: Pendekatan Semasa, Cabaran, dan Trend Masa Depan". Yang boleh didapati di sini

2). Kami menggunakan gambar sinar-X dari NIH: Pusat Klinikal. Pautan boleh didapati di sini

3). Bantuan pereka aplikasi boleh didapati di sini

4). Sebelum menjalankan kod: anda perlu menukar jalan Dir (dalam baris 34) ke direktori dan jenis gambar anda (baris 35) (kami sedang menganalisis *.png).

Langkah 1: Langkah 1: Memuatkan Imej

Langkah 1: Memuatkan Imej
Langkah 1: Memuatkan Imej

Langkah ini akan menunjukkan kepada anda gambar asal dalam skala kelabu. Tukar 'name_of_picture.png' ke nama gambar anda

jelas; clc; tutup semua;

%% Memuatkan gambar

raw_x_ray = 'name_of_picture.png';

I = imread (raw_x_ray);

rajah (101);

imshow (I);

colormap (kelabu);

tajuk ('Grayscale X-Ray');

Langkah 2: Langkah 2: Penapisan Kebisingan dan Histogram

Langkah 2: Penapisan Kebisingan dan Histogram
Langkah 2: Penapisan Kebisingan dan Histogram

Untuk mencari ambang gambar skala kelabu, kita melihat histogram untuk melihat apakah mod berbeza. Baca lebih lanjut di sini

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

rajah (102);

subplot (2, 1, 1);

imshow (I);

subplot (2, 1, 2);

imhist (I, 256);

Langkah 3: Langkah 3: Menetapkan Ambang

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

Langkah ini membolehkan anda menetapkan ambang mengikut histogram. morphologicalGradient akan menonjolkan kawasan yang berminat dengan warna merah, dan fungsi visboundari melapisi gambar paru-paru yang digariskan dan disaring dengan warna merah.

Dengan menggunakan regionprops, kita dapat menentukan susunan kekukuhan dan menyusunnya secara menurun. Seterusnya saya binari gambar sklae kelabu dan terapkan kaedah kecerunan morflogik dan mLoren Shurasking untuk menonjolkan kawasan minat (ROI). Langkah seterusnya adalah membalikkan gambar sehingga ROI paru-paru berwarna putih di latar belakang hitam. Saya menggunakan fungsi showMaskAsOverlay untuk memaparkan 2 topeng. Catatan: kod itu diilhamkan dari pautan Loren Shure.

Dengan jayanya, saya membuat garis besar merah dengan menggunakan bwbwboundaries dan menutupi tapisan gambar dan sempadannya.

a_thresh = I> = 172; % menetapkan ambang ini

[labelImage, numberOfBlobs] = bwlabel (a_thresh);

props = regionprops (a_thresh, 'semua');

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

SB = disusunSolidity (1);

jika SB == 1% SB hanya menerima kekukuhan == 1 tapiskan tulang

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

imshow (binaryImage); colormap (kelabu);

SE = strel ('persegi', 3);

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

topeng = imbinarize (morfologiGradient, 0.03);

SE = strel ('persegi', 2);

topeng = imclose (topeng, SE);

topeng = imfill (topeng, 'lubang');

topeng = bwareafilt (topeng, 2); % kawalan bilangan kawasan menunjukkan

notMask = ~ topeng;

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

showMaskAsOverlay (0.5, topeng, 'r'); % anda harus memuat turun aplikasi / fungsi showMaskAsOverlay

BW2 = imfill (binaryImage, 'hole');

new_image = BW2;

new_image (~ topeng) = 0; % latar belakang dan lubang terbalik

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

rajah (104);

imshow (new_image);

tahan

batas visitori (B);

akhir

Langkah 4: Membuat GUI

Sekarang, kami menggabungkan kod sebelumnya ke dalam aplikasi MATLAB. Buka Pereka Aplikasi dalam MATLAB (Baru> Aplikasi). Pertama, kami merancang antara muka dengan klik-tahan-dan menyeret tiga paksi ke ruang kerja tengah. Seterusnya, kami klik-tahan-seret dua butang, satu bidang edit (teks), satu bidang edit (berangka), satu gelangsar, dan satu menu lungsur. Dua paksi masing-masing akan menampilkan pratonton dan menganalisis gambar, dan sumbu ketiga akan menampilkan histogram piksel untuk pratonton gambar "terpilih". Kotak bidang edit (teks) akan memaparkan jalur file gambar yang dipilih, dan bidang edit (angka) akan memaparkan kawasan piksel paru-paru yang terdeteksi.

Sekarang beralih dari paparan reka bentuk ke paparan kod dalam Pereka Aplikasi. Masukkan dalam kod kod untuk sifat dengan mengklik butang "Properties" berwarna merah dengan tanda tambah darinya. Memulakan sifat I, ambang, dan wilayahToExtract seperti dalam kod yang disediakan di bawah. Seterusnya, klik kanan butang di bahagian kanan atas ruang kerja (Penyemak Imbas Komponen) dan pergi dari Panggilan Balik> Pergi ke… panggil balik. Tambahkan kod untuk "fungsi SelectImageButtonPushed (aplikasi, acara)." Kod ini membolehkan anda memilih gambar untuk dianalisis dari komputer anda menggunakan uigetfile. Setelah memilih gambar, gambar pratonton akan muncul di bawah sumbu disertai histogram. Kemudian, klik kanan butang lain dan ulangi prosedur yang sama untuk membuat fungsi panggilan balik.

Tambahkan kod di bawah "function AnalyzeImageButtonPushed (aplikasi, acara)." Kod ini akan melakukan penghitungan piksel dan pengesanan gumpalan pada gambar pratonton pada butang menganalisis gambar (mana yang anda klik kanan untuk kod ini). Setelah memprogramkan butang, kita sekarang akan memprogram slaid dan menu drop-down. Klik kanan slaid, buat fungsi panggilan balik dan tambahkan kod di bawah "fungsi FilterThresholdSliderValueChanged (aplikasi, acara)" hingga akhir. Ini membolehkan slaid menyesuaikan ambang keamatan kelabu.

Buat fungsi panggilan balik untuk menu lungsur turun, dan tambahkan kod di bawah "fungsi AreastoExtractDropDownValueChanged (aplikasi, acara)" untuk membolehkan menu tarik turun mengubah jumlah gumpalan yang ditunjukkan pada paksi gambar yang dianalisis. Sekarang, klik setiap entiti dalam Komponen Penyemak Imbas dan ubah sifatnya mengikut keinginan anda, seperti menukar nama entiti, membuang sumbu, dan mengubah skala. Seret dan lepaskan entiti Penyemak Imbas Komponen dalam Paparan Reka Bentuk ke susun atur yang berfungsi dan mudah difahami. Anda kini mempunyai aplikasi dalam MATLAB yang dapat menganalisis gambar paru-paru untuk kawasan piksel!

sifat (Akses = peribadi) I = ; % fail gambar

ambang = 257; ambang% untuk intensiti kelabu binarizing

wilayahToExtract = 2;

akhir

fungsi SelectImageButtonPushed (aplikasi, acara)

clc; Dir = 'C: / Users / danie / Downloads / images_004 / images'; % menentukan fail invariate "awalan"

[imageExt, path] = uigetfile ('*. png'); % ambil bahagian berubah dari nama gambar

imageName = [Dir filesep imageExt]; % merangkumi rentetan invariate dan pemboleh ubah

app. I = imread (imageName); % membaca gambar

imshow (app. I, 'induk', app. UIAxes); % memaparkan gambar

app. FilePathEditField. Value = jalan; % jalan fail paparan dari mana asal gambar

akhir

fungsi AnalyzeImageButtonPushed (aplikasi, acara)

originalImage = app. I;

originalImage = wiener2 (app. I, [5 5]); % penapis penghapusan titik

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

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

labelImage = bwlabel (a_thresh);

props = regionprops (a_thresh, 'semua');

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

SB = disusunSolidity (1);

jika SB == 1% SB hanya menerima kekukuhan == 1 tapiskan tulang

SE = strel ('persegi', 3);

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

topeng = imbinarize (morfologiGradient, 0.03);

SE = strel ('persegi', 2);

topeng = imclose (topeng, SE);

topeng = imfill (topeng, 'lubang');

mask = bwareafilt (topeng, app.regionsToExtract);

% kawalan bilangan kawasan menunjukkan

notMask = ~ topeng;

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

BW2 = imfill (labelImage, 'lubang');

new_image = BW2;

new_image (~ topeng) = 0;

B = bwboundaries (new_image); % hanya boleh menerima 2 dimensi tayangan (new_image, 'parent', app. UIAxes2);

tahan (app. UIAxes2, 'on');

batas visitori (B);

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

lungArea = bwarea (new_image);

app. PixelAreaEditField. Value = lungArea;

akhir

akhir

fungsi FilterThresholdSliderValueChanged (aplikasi, acara)

app.threshold = app. FilterThresholdSlider. Value;

akhir

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

app.regionsToExtract = str2double (stringNumber);

akhir

akhir

Disyorkan: