% 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