117 lines
3.6 KiB
Matlab
117 lines
3.6 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
|
|
splitRatio = 0.8;
|
|
|
|
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), :);
|
|
|
|
% Tampilkan pembagian data
|
|
disp('XTrain:');
|
|
disp(XTrain);
|
|
disp('YTrain:');
|
|
disp(YTrain);
|
|
disp('XTest:');
|
|
disp(XTest);
|
|
disp('YTest:');
|
|
disp(YTest);
|
|
|
|
% Latih model KNN
|
|
k = 5; % Nilai k yang digunakan
|
|
knnModel = fitcknn(XTrain, YTrain, 'NumNeighbors', k);
|
|
|
|
% Prediksi dan evaluasi pada data latih
|
|
YTrainPred = predict(knnModel, XTrain);
|
|
trainConfMat = confusionmat(YTrain, YTrainPred);
|
|
disp('Confusion Matrix pada data training:');
|
|
disp(trainConfMat);
|
|
figure;
|
|
confusionchart(YTrain, YTrainPred);
|
|
title('Confusion Matrix pada Data Training');
|
|
|
|
% Hitung akurasi pada data latih
|
|
trainAccuracy = sum(diag(trainConfMat)) / sum(trainConfMat(:)) * 100;
|
|
fprintf('Akurasi pada data training: %.2f%%\n', trainAccuracy);
|
|
|
|
% Prediksi dan evaluasi pada data uji
|
|
YTestPred = predict(knnModel, XTest);
|
|
testConfMat = confusionmat(YTest, YTestPred);
|
|
disp('Confusion Matrix pada data testing:');
|
|
disp(testConfMat);
|
|
figure;
|
|
confusionchart(YTest, YTestPred);
|
|
title('Confusion Matrix pada Data Testing');
|
|
|
|
% Hitung akurasi pada data uji
|
|
testAccuracy = sum(diag(testConfMat)) / sum(testConfMat(:)) * 100;
|
|
fprintf('Akurasi pada data testing: %.2f%%\n', testAccuracy);
|