Klasifikasi Citra Retina untuk Deteksi Microaneurisme Menggunakan KNN Berbasis Ekstraksi Ciri LBP dan Wavelet
Microaneurisme merupakan salah satu tanda awal retinopati diabetik yang muncul pada citra retina sebagai titik-titik kecil berwarna merah. Deteksi dini microaneurisme sangat penting untuk mencegah kerusakan penglihatan yang lebih parah. Pada penelitian ini, dibuat sebuah sistem klasifikasi citra retina dengan dua kelas keluaran: microaneurisme dan non microaneurisme.
Metode klasifikasi yang digunakan adalah K-Nearest Neighbor (KNN) dengan jumlah tetangga (k) = 5. Untuk mendapatkan ciri (fitur) yang representatif, citra diekstraksi menggunakan Local Binary Pattern (LBP) dan transformasi wavelet Daubechies. Hasil dari penelitian ini diharapkan dapat membantu proses diagnosis awal secara otomatis, cepat, dan akurat.
Dataset
Dataset yang digunakan terdiri dari:
- Microaneurisme:
- 80 citra untuk pelatihan
- 50 citra untuk pengujian
- Non Microaneurisme:
- 20 citra untuk pelatihan
- 18 citra untuk pengujian
Seluruh citra dikonversi menjadi grayscale, kemudian diubah ukurannya agar proses komputasi lebih cepat.
Metode
- Preprocessing Citra:
- Citra RGB diperkecil ukurannya menjadi 10% dari ukuran asli.
- Citra kemudian diubah ke grayscale untuk menyederhanakan data.
- Ekstraksi Ciri:
- Menggunakan LBP untuk mendapatkan pola tekstur citra.
- Hasil LBP kemudian ditransformasi menggunakan wavelet db4 level 1.
- Koefisien hasil transformasi diseleksi menggunakan threshold = 0.5 untuk mengurangi noise.
- Pelatihan Model:
- Data ciri dari microaneurisme dan non microaneurisme digabung.
- Model KNN dengan k = 5 dilatih menggunakan fungsi
fitcknn.
- Pengujian Model:
- Model yang sudah dilatih diuji pada data uji.
- Akurasi dihitung berdasarkan perbandingan antara kelas keluaran dan target asli.

Hasil
Hasil eksperimen menunjukkan bahwa sistem yang dibangun memiliki performa yang sangat baik.
- Akurasi Pelatihan: 99%
- Akurasi Pengujian: 98.53%
Nilai akurasi yang tinggi menunjukkan bahwa kombinasi ekstraksi ciri LBP + wavelet dan klasifikasi KNN dapat mengklasifikasikan citra retina dengan sangat baik, meskipun jumlah data relatif terbatas.
Source Code:
function varargout = program_gui(varargin)
% PROGRAM_GUI MATLAB code for program_gui.fig
% PROGRAM_GUI, by itself, creates a new PROGRAM_GUI or raises the existing
% singleton*.
%
% H = PROGRAM_GUI returns the handle to a new PROGRAM_GUI or the handle to
% the existing singleton*.
%
% PROGRAM_GUI('CALLBACK',hObject,eventData,handles,...) calls the local
% function named CALLBACK in PROGRAM_GUI.M with the given input arguments.
%
% PROGRAM_GUI('Property','Value',...) creates a new PROGRAM_GUI or raises the
% existing singleton*. Starting from the left, property value pairs are
% applied to the GUI before program_gui_OpeningFcn gets called. An
% unrecognized property name or invalid value makes property application
% stop. All inputs are passed to program_gui_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_gui
% Last Modified by GUIDE v2.5 06-Jul-2022 07:16:29
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @program_gui_OpeningFcn, ...
'gui_OutputFcn', @program_gui_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_gui is made visible.
function program_gui_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_gui (see VARARGIN)
% Choose default command line output for program_gui
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
movegui(hObject,'center');
warning off all;
% UIWAIT makes program_gui wait for user response (see UIRESUME)
% uiwait(handles.figure1);
% --- Outputs from this function are returned to the command line.
function varargout = program_gui_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;
% --- 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 file
[nama_file,nama_folder] = uigetfile({'*.mat','MAT File (*.mat)';
'*.*','All file type (*.*)'},'Browse File');
% jika ada file yg dipilih maka akan mengeksekusi perintah yg ada di bawahnya
if ~isequal(nama_file,0)
% mereset button2
axes(handles.axes1)
cla reset
set(gca,'XTick',[])
set(gca,'YTick',[])
axes(handles.axes2)
cla reset
set(gca,'XTick',[])
set(gca,'YTick',[])
set(handles.edit1,'String','')
set(handles.edit2,'String','')
set(handles.uitable1,'Data',[])
set(handles.uitable2,'Data',[])
set(handles.pushbutton3,'Enable','off')
set(handles.pushbutton4,'Enable','off')
set(handles.pushbutton5,'Enable','off')
% menyimpan variabel nama_folder & nama_file pada lokasi handles agar dapat
% dipanggil oleh pushbutton yg lain
handles.nama_folder = nama_folder;
handles.nama_file = nama_file;
guidata(hObject,handles);
set(handles.pushbutton2,'Enable','on')
else
% jika tidak ada file yg dipilih maka akan kembali
return
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)
% menampilkan menu browse file
[nama_file,nama_folder] = uigetfile({'*.png'});
% jika ada file yg dipilih maka mengeksekusi perintah2 yg ada di bawahnya
if ~isequal(nama_file,0)
% mereset button2
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',[])
axes(handles.axes4)
cla reset
set(gca,'XTick',[])
set(gca,'YTick',[])
set(handles.edit1,'String','')
set(handles.edit2,'String','')
set(handles.uitable1,'Data',[])
set(handles.uitable2,'Data',[])
set(handles.pushbutton4,'Enable','off')
set(handles.pushbutton5,'Enable','off')
% membaca file citra
Img = imread(fullfile(nama_folder,nama_file));
% menampilkan citra pada axes
axes(handles.axes1)
imshow(Img)
title('Citra RGB')
% menampilkan nama file citra pada edit text
set(handles.edit1,'String',nama_file)
% menyimpan variabel Img pada lokasi handles agar dapat dipanggil oleh
% pushbutton yg lain
handles.Img = Img;
guidata(hObject, handles)
% mereset button2
set(handles.pushbutton3,'Enable','on')
else
% jika tidak ada file yg dipilih maka akan kembali
return
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)
% mereset button2
axes(handles.axes2)
cla reset
set(gca,'XTick',[])
set(gca,'YTick',[])
axes(handles.axes3)
cla reset
set(gca,'XTick',[])
set(gca,'YTick',[])
axes(handles.axes4)
cla reset
set(gca,'XTick',[])
set(gca,'YTick',[])
set(handles.edit2,'String','')
set(handles.uitable1,'Data',[])
set(handles.uitable2,'Data',[])
set(handles.pushbutton5,'Enable','off')
% memanggil variabel Img yg ada pada lokasi handles
Img = handles.Img;
% memperkecil ukuran citra untuk mempercepat komputasi
Img_rsz = imresize(Img,0.1);
% menampilkan citra pada axes
axes(handles.axes2)
imshow(Img_rsz)
title('Hasil Resize')
% mengkonversi citra rgb menjadi citra grayscale
Img_gray = rgb2gray(Img_rsz);
% menampilkan citra pada axes
axes(handles.axes3)
imshow(Img_gray)
title('Citra Grayscale')
% melakukan ekstraksi ciri LBP
LBP_features = extractLBPFeatures(Img_gray,'Upright',false);
% menampilkan diagram pada axes
axes(handles.axes4)
% menampilkan hasil ekstraksi ciri LBP
bar(LBP_features);
grid on
title('LBP Features')
xlabel('LBP Histogram Bins')
% mengisi variabel data dengan ciri hasil ekstraksi
data = cell(1,2);
data{1,1} = '1';
data{2,1} = '2';
data{3,1} = '3';
data{4,1} = '4';
data{5,1} = '5';
data{6,1} = '6';
data{7,1} = '7';
data{8,1} = '8';
data{9,1} = '9';
data{10,1} = '10';
data{1,2} = num2str(LBP_features(1));
data{2,2} = num2str(LBP_features(2));
data{3,2} = num2str(LBP_features(3));
data{4,2} = num2str(LBP_features(4));
data{5,2} = num2str(LBP_features(5));
data{6,2} = num2str(LBP_features(6));
data{7,2} = num2str(LBP_features(7));
data{8,2} = num2str(LBP_features(8));
data{9,2} = num2str(LBP_features(9));
data{10,2} = num2str(LBP_features(10));
% menampilkan variabel data pada tabel
set(handles.uitable1,'Data',data)
% menyimpan variabel2 pada lokasi handles agar dapat dipanggil oleh
% pushbutton yg lain
handles.LBP_features = LBP_features;
guidata(hObject, handles)
% mereset button2
set(handles.pushbutton4,'Enable','on')
% --- 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)
% mereset button2
set(handles.edit2,'String','')
% memanggil variabel2 yg ada di lokasi handles
LBP_features = handles.LBP_features;
% melakukan transformasi wavelet
wavelet_name = 'db4';
level = 1;
[cA, ~] = wavedec(LBP_features, level, wavelet_name);
% seleksi ciri
threshold = 0.5;
cA_selected = wthresh(cA, 'h', threshold);
% mengisi variabel data dengan ciri hasil ekstraksi
data = cell(16,2);
data{1,1} = '1';
data{2,1} = '2';
data{3,1} = '3';
data{4,1} = '4';
data{5,1} = '5';
data{6,1} = '6';
data{7,1} = '7';
data{8,1} = '8';
data{9,1} = '9';
data{10,1} = '10';
data{11,1} = '11';
data{12,1} = '12';
data{13,1} = '13';
data{14,1} = '14';
data{15,1} = '15';
data{16,1} = '16';
data{1,2} = num2str(cA_selected(1));
data{2,2} = num2str(cA_selected(2));
data{3,2} = num2str(cA_selected(3));
data{4,2} = num2str(cA_selected(4));
data{5,2} = num2str(cA_selected(5));
data{6,2} = num2str(cA_selected(6));
data{7,2} = num2str(cA_selected(7));
data{8,2} = num2str(cA_selected(8));
data{9,2} = num2str(cA_selected(9));
data{10,2} = num2str(cA_selected(10));
data{11,2} = num2str(cA_selected(11));
data{12,2} = num2str(cA_selected(12));
data{13,2} = num2str(cA_selected(13));
data{14,2} = num2str(cA_selected(14));
data{15,2} = num2str(cA_selected(15));
data{16,2} = num2str(cA_selected(16));
% menampilkan variabel data pada tabel
set(handles.uitable2,'Data',data)
% menyimpan variabel2 pada lokasi handles agar dapat dipanggil oleh
% pushbutton yg lain
handles.cA_selected = cA_selected;
guidata(hObject, handles)
% mereset button2
set(handles.pushbutton5,'Enable','on')
% --- 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 variabel2 yg ada di lokasi handles
cA_selected = handles.cA_selected;
% memanggil model KNN hasil pelatihan
load Mdl
% membaca kelas keluaran
kelas_keluaran = predict(Mdl,cA_selected);
% menampilkan kelas keluaran pada edit text
set(handles.edit2,'String',kelas_keluaran)
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
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
% --- Executes on button press in pushbutton6.
function pushbutton6_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton8 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% mereset button2
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',[])
axes(handles.axes4)
cla reset
set(gca,'XTick',[])
set(gca,'YTick',[])
set(handles.edit1,'String','')
set(handles.edit2,'String','')
set(handles.uitable1,'Data',[])
set(handles.uitable2,'Data',[])
set(handles.pushbutton3,'Enable','off')
set(handles.pushbutton4,'Enable','off')
set(handles.pushbutton5,'Enable','off')
Posted on September 14, 2025, in Pengenalan Pola, Pengolahan Citra and tagged image processing, pemrograman matlab, pengolahan citra, Pengolahan Citra Digital, pengolahan citra digital menggunakan matlab. Bookmark the permalink. Leave a comment.


















































Leave a comment
Comments 0