PERHITUNGAN VOLUME TUMOR OTAK PADA CITRA MRI MENGGUNAKAN CONVOLUTIONAL NEURAL NETWORK RESNET-18
Tumor otak merupakan salah satu penyakit yang membutuhkan diagnosis akurat agar penanganannya optimal. Salah satu parameter penting dalam proses diagnosis adalah volume tumor, yang dapat digunakan untuk menentukan stadium penyakit dan memantau keberhasilan terapi. Metode manual berbasis ROI (Region of Interest) sering digunakan oleh radiolog, namun membutuhkan waktu lama dan sangat bergantung pada subjektivitas pengamat.
Penelitian ini mengimplementasikan metode semantic segmentation berbasis Convolutional Neural Network (CNN) arsitektur ResNet-18 pada citra MRI otak. Sebanyak 171 data citra DICOM beserta ground truth digunakan sebagai data latih untuk melatih model segmentasi. Sistem dilengkapi dengan antarmuka grafis (GUI) berbasis MATLAB yang mampu melakukan segmentasi otomatis, menghitung volume tumor, serta menampilkan visualisasi hasil dalam bentuk 2D maupun 3D.
Metodologi
Berikut ini diagram alur yang menggambarkan keseluruhan proses perhitungan volume tumor otak berbasis Convolutional Neural Network (CNN):
Proses dimulai dari akuisisi data citra MRI, yang kemudian melalui tahap pra-pemrosesan untuk normalisasi ukuran dan peningkatan kualitas citra. Model CNN dengan arsitektur ResNet-18 dilatih menggunakan data latih dan ground truth untuk menghasilkan model segmentasi yang andal. Hasil segmentasi digunakan sebagai dasar perhitungan volume tumor dengan memanfaatkan informasi spasial dari metadata citra, sebelum akhirnya divisualisasikan dalam bentuk dua dimensi maupun tiga dimensi untuk mendukung interpretasi klinis.
1. Akuisisi dan Preprocessing Data
Dataset terdiri dari 171 citra MRI otak dalam format DICOM beserta ground truth berupa mask biner tumor. Ground truth diperoleh melalui proses ROI manual menggunakan teknik freehand contouring, sehingga area tumor terdefinisi dengan baik.
Preprocessing dilakukan dengan:
- Konversi citra menjadi 8-bit grayscale
- Normalisasi ukuran citra menjadi 224×224 piksel
- Augmentasi data (rotasi, flipping) untuk meningkatkan generalisasi model
2. Arsitektur CNN
Model yang digunakan adalah DeepLabV3+ dengan ResNet-18 sebagai feature extractor. Arsitektur ini dipilih karena:
- Mendukung multi-scale context aggregation sehingga mampu memisahkan objek kecil seperti tumor
- Relatif ringan dan cepat untuk dilatih
- Telah terbukti efektif pada dataset medis dengan jumlah data terbatas
3. Pelatihan Model
Pelatihan dilakukan dengan parameter berikut:
- Optimizer: Stochastic Gradient Descent (SGDM)
- Learning Rate: 0.01
- Mini-batch Size: 32
- Epoch: 10
- Loss Function: Cross-entropy
Proses training dipantau menggunakan training-progress plot untuk memastikan model konvergen dengan baik.
4. Segmentasi dan Post-Processing
Hasil segmentasi dari model berupa peta kelas piksel (pixel-wise classification). Area yang terklasifikasi sebagai “Tumor” dikonversi menjadi citra biner. Dilakukan operasi morfologi berupa bwareaopen dan imfill untuk menghilangkan noise dan menutup lubang kecil pada hasil segmentasi.
5. Perhitungan Volume Tumor
Volume dihitung berdasarkan jumlah piksel tumor, dikalikan dengan resolusi spasial citra (PixelSpacing) dan ketebalan slice (SliceThickness) dari metadata DICOM.
Rumus perhitungannya:
6. Antarmuka Pengguna (GUI)
Sistem dilengkapi GUI yang ramah pengguna, memungkinkan:
- Memilih folder berisi citra MRI
- Menampilkan citra asli dan hasil segmentasi
- Visualisasi tumor dalam bentuk bounding box
- Menampilkan hasil 3D menggunakan fungsi vol3d
- Menyimpan hasil segmentasi, citra 3D, dan volume tumor ke file output
Hasil dan Pembahasan
Model berhasil mendeteksi area tumor dengan akurasi visual yang baik. GUI yang dikembangkan memudahkan pengguna dalam memverifikasi hasil segmentasi, sekaligus menghitung volume tumor secara otomatis.
Visualisasi 3D yang dihasilkan membantu radiolog atau peneliti melihat distribusi spasial tumor dalam volume otak secara lebih intuitif. Selain itu, proses otomatisasi ini mampu mengurangi waktu analisis secara signifikan dibandingkan metode manual.
Implementasi CNN berbasis ResNet-18 pada citra MRI otak berhasil memberikan hasil segmentasi yang akurat dan konsisten. Perhitungan volume tumor dapat dilakukan secara otomatis dan divisualisasikan dalam bentuk 3D. Sistem ini berpotensi menjadi alat bantu diagnosis yang efisien bagi radiolog, serta mendukung pengambilan keputusan klinis.
Source code:
function varargout = program_gui2(varargin)
% PROGRAM_GUI2 MATLAB code for program_gui2.fig
% PROGRAM_GUI2, by itself, creates a new PROGRAM_GUI2 or raises the existing
% singleton*.
%
% H = PROGRAM_GUI2 returns the handle to a new PROGRAM_GUI2 or the handle to
% the existing singleton*.
%
% PROGRAM_GUI2('CALLBACK',hObject,eventData,handles,...) calls the local
% function named CALLBACK in PROGRAM_GUI2.M with the given input arguments.
%
% PROGRAM_GUI2('Property','Value',...) creates a new PROGRAM_GUI2 or raises the
% existing singleton*. Starting from the left, property value pairs are
% applied to the GUI before program_gui2_OpeningFcn gets called. An
% unrecognized property name or invalid value makes property application
% stop. All inputs are passed to program_gui2_OpeningFcn via varargin.
%
% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one
% instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES
% Edit the above text to modify the response to help program_gui2
% Last Modified by GUIDE v2.5 10-Jun-2024 03:06:32
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @program_gui2_OpeningFcn, ...
'gui_OutputFcn', @program_gui2_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
% --- Executes just before program_gui2 is made visible.
function program_gui2_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to program_gui2 (see VARARGIN)
% Choose default command line output for program_gui2
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
movegui(hObject,'center');
warning off all;
% UIWAIT makes program_gui2 wait for user response (see UIRESUME)
% uiwait(handles.figure1);
% --- Outputs from this function are returned to the command line.
function varargout = program_gui2_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Get default command line output from handles structure
varargout{1} = handles.output;
function edit1_Callback(hObject, eventdata, handles)
% hObject handle to edit1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of edit1 as text
% str2double(get(hObject,'String')) returns contents of edit1 as a double
% --- Executes during object creation, after setting all properties.
function edit1_CreateFcn(hObject, eventdata, handles)
% hObject handle to edit1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% Hint: edit controls usually have a white background on Windows.
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% menampilkan menu "browse folder"
nama_folder = uigetdir;
% jika ada folder yg dipilih maka akan mengeksekusi perintah di bawah ini
if ~isequal(nama_folder,0)
% mereset GUI
axes(handles.axes1)
cla reset
set(gca,'XTick',[])
set(gca,'YTick',[])
axes(handles.axes2)
cla reset
set(gca,'XTick',[])
set(gca,'YTick',[])
axes(handles.axes3)
cla reset
set(gca,'XTick',[])
set(gca,'YTick',[])
set(handles.edit3,'String','-')
set(handles.pushbutton5,'Enable','off')
% menampilkan nama folder pada edit text
set(handles.edit1,'String',nama_folder)
% membaca nama file dicom dalam folder
nama_file = dir(fullfile(nama_folder,'*.dcm'));
% membaca file citra dicom
Img = dicomread(fullfile(nama_folder,nama_file(1).name));
% mengkonversi bit depth citra menjadi 8-bit
Img = uint8(255*mat2gray(Img));
% mengkonversi format citra menjadi format rgb
Img = cat(3,Img,Img,Img);
% menampilkan citra slice pertama pada axes
axes(handles.axes1)
imshow(Img,[])
title('Original Image')
% menyimpan variabel pada lokasi handles agar dapat dipanggil oleh
% pushbutton yg lain
handles.nama_folder = nama_folder;
handles.nama_file = nama_file;
handles.mask = [];
guidata(hObject, handles)
% mereset GUI
set(handles.edit2,'String','1')
set(handles.pushbutton2,'Enable','on')
set(handles.pushbutton3,'Enable','on')
set(handles.pushbutton4,'Enable','on')
end
% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% memanggil variabel yg ada di lokasi handles
nama_folder = handles.nama_folder;
nama_file = handles.nama_file;
% membaca urutan slice yg ada di edit text
num = str2double(get(handles.edit2,'String'));
if num>1
% membaca file citra dicom
Img = dicomread(fullfile(nama_folder,nama_file(num-1).name));
% mengkonversi bit depth citra menjadi 8-bit
Img = uint8(255*mat2gray(Img));
% mengkonversi format citra menjadi format rgb
Img = cat(3,Img,Img,Img);
% menampilkan citra slice pertama pada axes
axes(handles.axes1)
imshow(Img)
title('Original Image')
% menampilkan urutan slice pada edit text
set(handles.edit2,'String',num2str(num-1))
% menampilkan hasil segmentasi
try
% memanggil variabel mask yg ada di lokasi handles
mask = handles.mask;
% mengambil mask sesuai urutan slice citra
BW = mask(:,:,num-1);
% meresize ukuran citra
BW = imresize(BW,[size(Img,1),size(Img,2)]);
% hasil segmentasi
Img_seg = insertObjectMask(Img,BW,'LineColor','y','Opacity',0','LineWidth',4);
% menampilkan hasil segmentasi pada axes
axes(handles.axes2)
imshow(Img_seg)
title('Segmentation Result')
catch
return
end
end
% --- Executes on button press in pushbutton3.
function pushbutton3_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% memanggil variabel yg ada di lokasi handles
nama_folder = handles.nama_folder;
nama_file = handles.nama_file;
% membaca urutan slice yg ada di edit text
num = str2double(get(handles.edit2,'String'));
if num<numel(nama_file)
% membaca file citra dicom
Img = dicomread(fullfile(nama_folder,nama_file(num+1).name));
% mengkonversi bit depth citra menjadi 8-bit
Img = uint8(255*mat2gray(Img));
% mengkonversi format citra menjadi format rgb
Img = cat(3,Img,Img,Img);
% menampilkan citra slice pertama pada axes
axes(handles.axes1)
imshow(Img)
title('Original Image')
% menampilkan urutan slice pada edit text
set(handles.edit2,'String',num2str(num+1))
% menampilkan hasil segmentasi
try
% memanggil variabel mask yg ada di lokasi handles
mask = handles.mask;
% mengambil mask sesuai urutan slice citra
BW = mask(:,:,num+1);
% meresize ukuran citra
BW = imresize(BW,[size(Img,1),size(Img,2)]);
% hasil segmentasi
Img_seg = insertObjectMask(Img,BW,'LineColor','y','Opacity',0','LineWidth',4);
% menampilkan hasil segmentasi pada axes
axes(handles.axes2)
imshow(Img_seg)
title('Segmentation Result')
catch
return
end
end
% --- Executes on button press in pushbutton4.
function pushbutton4_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton4 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% memanggil variabel yg ada di lokasi handles
nama_folder = handles.nama_folder;
nama_file = handles.nama_file;
% melakukan pengolahan citra terhadap seluruh file
for i = 1:numel(nama_file)
% membaca file citra dicom
Img1 = dicomread(fullfile(nama_folder,nama_file(i).name));
% mengkonversi bit depth citra menjadi 8-bit
Img1 = uint8(255*mat2gray(Img1));
% menyusun variabel D
D(:,:,i) = Img1;
% meresize citra
Img = imresize(Img1,[224 224]);
Img = cat(3,Img,Img,Img);
% segmentasi semantic
load net
[C,~] = semanticseg(Img,net);
BW = (C=="Tumor");
% operasi morfologi untuk menyempurnakan hasil segmentasi
bw = bwareaopen(BW,20);
bw = imfill(bw,'holes');
mask(:,:,i) = imresize(bw,[size(Img1,1),size(Img1,2)]);
end
% membaca urutan slice yg ada di edit text
num = str2double(get(handles.edit2,'String'));
% membaca file citra dicom
Img = dicomread(fullfile(nama_folder,nama_file(num).name));
% mengkonversi bit depth citra menjadi 8-bit
Img = uint8(255*mat2gray(Img));
% mengkonversi format citra menjadi format rgb
Img = cat(3,Img,Img,Img);
% mengambil mask sesuai urutan slice citra
BW = mask(:,:,num);
% hasil segmentasi
Img_seg = insertObjectMask(Img,BW,'LineColor','y','Opacity',0','LineWidth',4);
% menampilkan hasil segmentasi pada axes
axes(handles.axes2)
imshow(Img_seg)
title('Segmentation Result')
% membaca metadata file dicom
metadata = dicominfo(fullfile(nama_folder,nama_file(1).name));
% perhitungan volume tumor
luas_px = sum(sum(sum(mask)));
luas_mm2 = luas_px*metadata.PixelSpacing(1)*metadata.PixelSpacing(2);
volume_mm3 = luas_mm2*metadata.SliceThickness;
volume_cm3 = sprintf('%0.2f',volume_mm3/1000);
% menampilkan volume hasil perhitungan pada edit text
set(handles.edit3,'String',[volume_cm3,' cc'])
% menampilkan citra dicom dalam tampilan 3D
axes(handles.axes3);
cla reset
D = cat(3,zeros(size(D,1),size(D,2)),D);
vol3d('cdata',D,'texture','3D');
title('3D Visualization')
colormap(gray(256));
view([50 -50]);
axis off; daspect([1 1 .06])
alphamap('rampup');
alphamap(.04 .* alphamap);
xlim([0 size(D,1)])
ylim([0 size(D,2)])
zlim([0 size(D,3)])
hold on
% menampilkan hasil contouring dalam tampilan 3D
data = double(mask*255*ones);
data = cat(3,data(:,:,1),data);
save data data
fv = isosurface(data,.5);
patch(fv,'FaceColor','yellow','EdgeColor','none');
view([50 -50]);
daspect([1,1,.06])
axis tight
camlight
camlight(-80,-10)
lighting gouraud
xlim([0 size(D,1)])
ylim([0 size(D,2)])
zlim([0 size(D,3)])
hold off
% mereset GUI
set(handles.pushbutton5,'Enable','on')
% menyimpan variabel pada lokasi handles agar dapat dipanggil oleh
% pushbutton yg lain
handles.mask = mask;
handles.volume_mm3 = volume_mm3;
guidata(hObject, handles)
% --- Executes on button press in pushbutton5.
function pushbutton5_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton5 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% memanggil variabel yg ada di lokasi handles
nama_folder = handles.nama_folder;
nama_file = handles.nama_file;
mask = handles.mask;
volume_mm3 = handles.volume_mm3;
% melakukan pengolahan citra terhadap seluruh file
for i = 1:numel(nama_file)
% membaca file citra dicom
Img = dicomread(fullfile(nama_folder,nama_file(i).name));
% mengkonversi bit depth citra menjadi 8-bit
Img = uint8(255*mat2gray(Img));
% mengkonversi format citra menjadi format rgb
Img = cat(3,Img,Img,Img);
% menyimpan citra asli
imwrite(Img,fullfile(nama_folder,['Citra-Asli-',nama_file(i).name(1:end-4),'.jpg']))
% hasil segmentasi
RGB = insertObjectMask(Img,mask(:,:,i),'LineColor','y','Opacity',0','LineWidth',4);
% menyimpan citra hasil segmentasi
imwrite(RGB,fullfile(nama_folder,['Hasil-Segmentasi-',nama_file(i).name(1:end-4),'.jpg']))
end
% menyimpan citra 3D
F = getframe(handles.axes3);
Image = frame2im(F);
imwrite(Image,fullfile(nama_folder,'3D-Visualization.jpg'))
fid = fopen(fullfile(nama_folder,'Volume.txt'),'wt');
fprintf(fid, '%s\n%s\n%s', volume_mm3);
fclose(fid);
% --- Executes on button press in pushbutton6.
function pushbutton6_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton6 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% mereset GUI
axes(handles.axes1)
cla reset
set(gca,'XTick',[])
set(gca,'YTick',[])
axes(handles.axes2)
cla reset
set(gca,'XTick',[])
set(gca,'YTick',[])
axes(handles.axes3)
cla reset
set(gca,'XTick',[])
set(gca,'YTick',[])
set(handles.edit1,'String','-')
set(handles.edit2,'String','0')
set(handles.edit3,'String','-')
set(handles.pushbutton2,'Enable','off')
set(handles.pushbutton3,'Enable','off')
set(handles.pushbutton4,'Enable','off')
set(handles.pushbutton5,'Enable','off')
function edit2_Callback(hObject, eventdata, handles)
% hObject handle to edit2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of edit2 as text
% str2double(get(hObject,'String')) returns contents of edit2 as a double
% --- Executes during object creation, after setting all properties.
function edit2_CreateFcn(hObject, eventdata, handles)
% hObject handle to edit2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% Hint: edit controls usually have a white background on Windows.
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function edit3_Callback(hObject, eventdata, handles)
% hObject handle to edit3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of edit3 as text
% str2double(get(hObject,'String')) returns contents of edit3 as a double
% --- Executes during object creation, after setting all properties.
function edit3_CreateFcn(hObject, eventdata, handles)
% hObject handle to edit3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% Hint: edit controls usually have a white background on Windows.
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
Posted on September 20, 2025, in Pengenalan Pola, Pengolahan Citra and tagged convolutional neural network, deep convolutional neural network, pengolahan citra, resnet, Volume Tumor. Bookmark the permalink. Leave a comment.



























































Leave a comment
Comments 0