128 lines
4.4 KiB
Matlab
128 lines
4.4 KiB
Matlab
% Direktori gambar
|
|
folderTembakau = 'F:\SKRIPSI\MATLAB\Matlab Batik\Data Latih_1\Tembakau\';
|
|
folderKopi = 'F:\SKRIPSI\MATLAB\Matlab Batik\Data Latih_1\Kopi\';
|
|
|
|
% Membaca daftar gambar
|
|
imagesTembakau = dir(fullfile(folderTembakau, '*.jpg'));
|
|
imagesKopi = dir(fullfile(folderKopi, '*.jpg'));
|
|
|
|
% Inisialisasi variabel untuk menyimpan fitur dan label
|
|
features = [];
|
|
labels = [];
|
|
|
|
% Ukuran resize
|
|
resizeSize = [300, 300];
|
|
|
|
% Ekstraksi fitur dari gambar motif batik tembakau
|
|
for i = 1:length(imagesTembakau)
|
|
img = imread(fullfile(folderTembakau, imagesTembakau(i).name));
|
|
|
|
% Resize gambar
|
|
imgResized = imresize(img, resizeSize);
|
|
|
|
% Ubah menjadi grayscale
|
|
imgGray = rgb2gray(imgResized);
|
|
|
|
glcm = graycomatrix(imgGray, 'Offset', [0 1; -1 1; -1 0; -1 -1]);
|
|
stats = graycoprops(glcm);
|
|
|
|
% Menghitung entropi untuk setiap arah
|
|
entropy_vals = zeros(1, 4);
|
|
for j = 1:4
|
|
P = glcm(:, :, j) / sum(glcm(:, :, j), 'all');
|
|
entropy_vals(j) = -sum(P(:) .* log2(P(:) + eps)); % menambahkan eps untuk menghindari log(0)
|
|
end
|
|
|
|
featureVector = [mean(stats.Contrast), mean(stats.Correlation), mean(stats.Energy), mean(stats.Homogeneity), mean(entropy_vals)];
|
|
features = [features; featureVector];
|
|
labels = [labels; 1]; % Label untuk batik tembakau
|
|
end
|
|
|
|
% Ekstraksi fitur dari gambar motif batik kopi
|
|
for i = 1:length(imagesKopi)
|
|
img = imread(fullfile(folderKopi, imagesKopi(i).name));
|
|
|
|
% Resize gambar
|
|
imgResized = imresize(img, resizeSize);
|
|
|
|
% Ubah menjadi grayscale
|
|
imgGray = rgb2gray(imgResized);
|
|
|
|
glcm = graycomatrix(imgGray, 'Offset', [0 1; -1 1; -1 0; -1 -1]);
|
|
stats = graycoprops(glcm);
|
|
|
|
% Menghitung entropi untuk setiap arah
|
|
entropy_vals = zeros(1, 4);
|
|
for j = 1:4
|
|
P = glcm(:, :, j) / sum(glcm(:, :, j), 'all');
|
|
entropy_vals(j) = -sum(P(:) .* log2(P(:) + eps)); % menambahkan eps untuk menghindari log(0)
|
|
end
|
|
|
|
featureVector = [mean(stats.Contrast), mean(stats.Correlation), mean(stats.Energy), mean(stats.Homogeneity), mean(entropy_vals)];
|
|
features = [features; featureVector];
|
|
labels = [labels; 2]; % Label untuk batik kopi
|
|
end
|
|
|
|
% Persentase pembagian data latih dan data uji
|
|
splitRatios = [0.9, 0.8, 0.7, 0.6, 0.5];
|
|
kValues = [7, 9, 11, 13, 15];
|
|
|
|
for splitRatio = splitRatios
|
|
fprintf('Pembagian data latih dan data uji: %.0f:%.0f\n', splitRatio*100, (1-splitRatio)*100);
|
|
|
|
% Bagi data menjadi data latih dan data uji
|
|
cv = cvpartition(labels, 'HoldOut', 1 - splitRatio);
|
|
XTrain = features(training(cv), :);
|
|
YTrain = labels(training(cv), :);
|
|
XTest = features(test(cv), :);
|
|
YTest = labels(test(cv), :);
|
|
|
|
accuracies = zeros(length(kValues), 1);
|
|
|
|
for idx = 1:length(kValues)
|
|
k = kValues(idx);
|
|
|
|
% Latih model KNN
|
|
knnModel = fitcknn(XTrain, YTrain, 'NumNeighbors', k);
|
|
|
|
% Prediksi dan evaluasi
|
|
YPred = predict(knnModel, XTest);
|
|
|
|
% Hitung akurasi
|
|
accuracy = sum(YPred == YTest) / length(YTest);
|
|
accuracies(idx) = accuracy * 100;
|
|
|
|
% Menampilkan hasil
|
|
fprintf('Akurasi model dengan k=%d: %.2f%%\n', k, accuracy * 100);
|
|
|
|
% Menampilkan confusion matrix
|
|
confMat = confusionmat(YTest, YPred);
|
|
disp(['Confusion Matrix untuk k=' num2str(k) ':']);
|
|
disp(confMat);
|
|
|
|
% Visualisasi confusion matrix
|
|
figure;
|
|
confusionchart(YTest, YPred);
|
|
title(['Confusion Matrix untuk k=' num2str(k) ' dengan pembagian data ' num2str(splitRatio*100) ':' num2str((1-splitRatio)*100)]);
|
|
|
|
% Visualisasi hasil prediksi dengan grafik scatter
|
|
figure;
|
|
gscatter(XTest(:,1), XTest(:,2), YTest, 'rb', 'ox');
|
|
hold on;
|
|
gscatter(XTest(:,1), XTest(:,2), YPred, 'gb', 'x*');
|
|
xlabel('Fitur 1');
|
|
ylabel('Fitur 2');
|
|
title(['Grafik Titik Label KNN dengan k=' num2str(k) ' dan pembagian data ' num2str(splitRatio*100) ':' num2str((1-splitRatio)*100)]);
|
|
legend('Label Asli: Tembakau', 'Label Asli: Kopi', 'Prediksi: Tembakau', 'Prediksi: Kopi');
|
|
hold off;
|
|
end
|
|
|
|
% Plot akurasi untuk pembagian data saat ini
|
|
figure;
|
|
plot(kValues, accuracies, '-o');
|
|
xlabel('Nilai k');
|
|
ylabel('Akurasi (%)');
|
|
title(['Akurasi KNN untuk Berbagai Nilai k dengan pembagian data ' num2str(splitRatio*100) ':' num2str((1-splitRatio)*100)]);
|
|
grid on;
|
|
end
|