Beberapa waktu yang lalu saya ikut ujian mk computer vision. Saya kerjakan pada MAtlab 7.1. Berikut ceritanya….
Buatlah sebuah software untuk mengklasifikasikan jenis2 bendera berikut ini. Software yang anda buat harus memenuhi spesifikasi dibawah ini
- Menggunakan MATLAB
- Algoritma bebas tetapi mencakup Akuisisi Citra, Preprocessing, Ekstraksi Ciri & Klasifikasi
- Menggunakan sistem klasifikasi NSSD
- Lakukan analisis mengenai algoritma dan parameter – paramater perblok yang anda pilih sehingga algoritma dan parameter – parameter yang anda pilih menghasilkan output yang optimal berdasarkan akurasi
Save gambar tersebut dengan nama itali.jpg , japan.jpg, korea.jpg , argentina.jpg , india.jpg
Jawab
Keterangan :
IC(i) = intensitas frame pada pixel (i)
IB(i) = intensitas background pada pixel (i)
Q = detection region / ROI (Region of Interest)
N = jumlah pixel pada area Q
IC dan IB mempunyai cakupan nilai antara 0-255. IC sendiri adalah nilai intensitas pixel dari gambar tes. Sedangkan IB adalah intensitas pixel dari gambar asli. Q yang digunakan adalah keseluruhan area gambar.
Algoritma yang dirancang berikut ini adalah algoritma yang mencoba melakukan optimasi pada proses pengolahan data gambar sehingga proses perhitungan data semakin sedikit, maka waktu eksekusi bisa menjadi lebih cepat.
Beberapa hal yang dilakukan untuk mendukung algoritma yang dirancang adalah:
- Dilakukan filtering menggunakan metode Gaussian dengan kernel 9×9 dan sigma=2. Hal ini dimaksudkan untuk meredam noise dan menyamarkan gambar agar bisa lebih dekat dengan kemiripan terhadap gambar asli.
- Semua gambar yang diolah diatur ulang ukurannya menjadi 20×40 pixel (ini adalah Q).
- Proses perhitungan NSSD menggunakan gambar grayscale sehingga yang dihitung hanya satu layer data gambar (bukan 3 layer, RGB).
- Proses perhitungan NSSD didasarkan pada tiga pola utama dari gambar asli, yaitu:
- Pola ke-1, bendera Argentina dan India
- Pola ke-2, bendera Italia
- Pola ke-3, bendera Jepang dan Korea Selatan
Sehingga pada hasil akhir akan dihitung pola mana yang mempunyai nilai NSSD terkecil.
- Untuk mengklasifikasikan dari pola menjadi kategori bendera, digunakan perbandingan vector warna dari gambar tes dengan gambar asli. Nilai vector warna dihitung per-layer menggunakan rata-rata (mean) intensitas warna yang muncul pada tiap layer (RGB) sehingga hasilnya adalah nilai mean dari layer R, G, dan B. Ketiga komponen tersebut kemudian akan direpresentasikan kedalam vector 3 axis mempunyai arah dan besaran. Komponen dari vector tersebut akan menghasilkan Theta_1 (sudut antara sumbu R dan B) dan Theta_2 (sudut antara sumbu G dan vector resultan dari RB).
Untuk menghitung Theta_1 dan Theta_2 didapat dari persamaan berikut.
Nilai akurasi dihitung berdasarkan kemiripan dengan samperl pola berdasarkan nilai NSSD. Berikut persamaannya.
NSSDk adalah nilai NSSD terkecil urutan pola ke-k. Konstanta 65025 didapat dari angka maksimum intensitas pada data gambar yaitu 255 yang dikuadratkan (persamaan didapat dengan memperhatikan persamaan NSSD).
Berikut adalah gambar tes yang diujikan pada algoritma di atas.
LAMPIRAN 1: KODE MATLAB
clc
clear all
start_bar = 1;
start_kol = 1;
baris = 20;
kolom = 40;
im_bentuk = imread(‘argentina.jpg’);
im_bentuk = imresize(im_bentuk,[baris kolom]);
im_bentuk_array = im_bentuk;
G = fspecial(‘gaussian’,[9 9],2);
im_bentuk = imfilter(im_bentuk, G);
im_bentuk_array(:,:,1) = rgb2gray(im_bentuk);
%figure,imshow(im_bentuk_array(:,:,1));
im_bentuk = imread(‘itali.jpg’);
im_bentuk = imresize(im_bentuk,[baris kolom]);
im_bentuk = imfilter(im_bentuk, G);
im_bentuk_array(:,:,2) = rgb2gray(im_bentuk);
%figure,imshow(im_bentuk_array(:,:,2));
im_bentuk = imread(‘japan.jpg’);
im_bentuk = imresize(im_bentuk,[baris kolom]);
im_bentuk = imfilter(im_bentuk, G);
im_bentuk_array(:,:,3) = rgb2gray(im_bentuk);
%figure,imshow(im_bentuk_array(:,:,3));
prompt = {‘Nama file input:’};
dlg_title = ‘Masukan file input!’;
num_lines = 1;
def = {‘argentina’};
answer = inputdlg(prompt,dlg_title,num_lines,def);
jawab = [answer{1} ‘.jpg’];
im_input = imread(jawab());
im_input_ori = im_input;
im_input = imresize(im_input,[baris kolom]);
im_input = imfilter(im_input, G);
im_input_rgb = im_input;
im_input = rgb2gray(im_input);
buff_NSSD = 1000000;
for type_bentuk=1:3
SSD = 0;
N = baris*kolom;
for bar=start_bar:(baris+start_bar-1)
for kol=start_kol:(kolom+start_kol-1)
SSD = SSD + ((double(im_input(bar,kol))-double(im_bentuk_array(bar,kol,type_bentuk)))^2);
end
end
NSSD(type_bentuk) = SSD/N;
if(NSSD(type_bentuk)<buff_NSSD)
min_sort = type_bentuk;
buff_NSSD = NSSD(type_bentuk);
end
end
persentase_NSSD = 100-((NSSD(min_sort)/65025)*100);
%disp(‘bentuk:argentina,itali,japan’);
%NSSD
%min_sort
r = im_input_rgb(uint8((baris/2)-(baris/4)):uint8((baris/2)+(baris/4)),uint8((kolom/2)-(kolom/4)):uint8((kolom/2)+(kolom/4)),1);
r = mean2(r);
g = im_input_rgb(uint8((baris/2)-(baris/4)):uint8((baris/2)+(baris/4)),uint8((kolom/2)-(kolom/4)):uint8((kolom/2)+(kolom/4)),2);
g = mean2(g);
b = im_input_rgb(uint8((baris/2)-(baris/4)):uint8((baris/2)+(baris/4)),uint8((kolom/2)-(kolom/4)):uint8((kolom/2)+(kolom/4)),3);
b = mean2(b);
vektor_resultan_rb = sqrt((r^2)+(b^2));
vektor_sudut1 = acosd((r/vektor_resultan_rb));
vektor_resultan_rgb = sqrt((vektor_resultan_rb^2)+(g^2));
vektor_sudut2 = acosd((vektor_resultan_rb/vektor_resultan_rgb));
figure(‘Name’,‘Hasilnya adalah…’),
subplot(1,2,1),imshow(im_input_ori),title( {‘gambar masukan’;
[‘mean r=’ int2str(r) ‘ g=’ int2str(g) ‘ b=’ int2str(b)];
[‘\Theta_{r-b} =’ int2str(vektor_sudut1) ‘^{0} \Theta_{rb-g} =’ int2str(vektor_sudut2) ‘^{0}’]})
switch(min_sort)
case 1
if vektor_sudut1>49
subplot(1,2,2),imshow(‘argentina.jpg’),title([‘gambar prediksi: ‘ int2str(persentase_NSSD) ‘% ARGENTINA’])
pause(5)
close all
else
subplot(1,2,2),imshow(‘india.jpg’),title([‘gambar prediksi: ‘ int2str(persentase_NSSD) ‘% INDIA’])
pause(5)
close all
end
case 2
subplot(1,2,2),imshow(‘itali.jpg’),title([‘gambar prediksi: ‘ int2str(persentase_NSSD) ‘% ITALI’])
pause(5)
close all
case 3
if vektor_sudut1<38
subplot(1,2,2),imshow(‘japan.jpg’),title([‘gambar prediksi: ‘ int2str(persentase_NSSD) ‘% JEPANG’])
pause(5)
close all
else
subplot(1,2,2),imshow(‘korea.jpg’),title([‘gambar prediksi: ‘ int2str(persentase_NSSD) ‘% KOREA SELATAN’])
pause(5)
close all
end
end
________________________________________________
DAFTAR PUSTAKA
Click to access viewer.php
Petra Christian University Library – /jiunkpe/s1/elkt/2007/jiunkpe-ns-s1-2007-23401003-8181-sinyal_v
Click to access viewer.php
http://siddhantahuja.wordpress.com/2009/05/20/correlation-based-similarity-measure-sum-of-squared-differences-ssd/
http://siddhantahuja.wordpress.com/tag/sum-of-squared-differences/
__________________________________________________
kode lainnya yang saya kembangkan dengan pendekatan yang berbeda
____________________double.m
clc;
clear all;
baris = 180;
kolom = 360;
jum_layer = 3;
threshold_klasifikasi = 333; %persentase toleransi kemiripan
interval_scan_baris = baris/6;
interval_scan_kolom = kolom/6;
jum_lipat = 3;
input_bendera = imread(‘tes10.jpg’);
bendera_normal = imresize(input_bendera,[baris kolom]);
dir_gambar = [dir(‘itali.jpg’) dir(‘japan.jpg’) dir(‘korea.jpg’) dir(‘argentina.jpg’) dir(‘india.jpg’)];
for i=1:5
buff_NSSD = 1000000;
i
for lipat=1:jum_lipat
N = (baris/lipat)*(kolom/lipat)*jum_layer;
bendera_source = imread(dir_gambar(i).name);
bendera_source = imresize(bendera_source,[baris/lipat kolom/lipat]);
for scan_y=1:interval_scan_baris:(baris – (baris/(2^(lipat-1))) + 1)
for scan_x=1:interval_scan_kolom:(kolom – (kolom/(2^(lipat-1))) + 1)
bendera_sum = 0;
for layer=1 : jum_layer
for n=1 : baris/lipat
for m=1 : kolom/lipat
bendera_sum = bendera_sum + ((double(bendera_normal((scan_y+n-1),(scan_x+m-1),layer)) – double(bendera_source(n,m,layer)))^2);
end
end
end
nilai_NSSD(i) = bendera_sum/N;
if nilai_NSSD(i) < buff_NSSD
buff_NSSD = nilai_NSSD(i);
end
end
end
end
nilai_NSSD(i) = buff_NSSD;
end
%================EDGE======================
bendera_source = imresize(bendera_source,[baris/lipat kolom/lipat]);
bendera_source = rgb2gray(bendera_source);
bendera_source = edge(bendera_source,’sobel’,0.009);
for i=1:5
buff_NSSD = 1000000;
i
for lipat=1:jum_lipat
N = (baris/lipat)*(kolom/lipat);
bendera_source = imread(dir_gambar(i).name);
bendera_source = imresize(bendera_source,[baris/lipat kolom/lipat]);
bendera_source = rgb2gray(bendera_source);
bendera_source = edge(bendera_source,’sobel’);
for scan_y=1:interval_scan_baris:(baris – (baris/(2^(lipat-1))) + 1)
for scan_x=1:interval_scan_kolom:(kolom – (kolom/(2^(lipat-1))) + 1)
bendera_sum = 0;
for n=1 : baris/lipat
for m=1 : kolom/lipat
bendera_sum = bendera_sum + ((double(bendera_normal((scan_y+n-1),(scan_x+m-1))) – double(bendera_source(n,m)))^2);
end
end
nilai_NSSD_edge(i) = bendera_sum/N;
if nilai_NSSD_edge(i) < buff_NSSD
buff_NSSD = nilai_NSSD_edge(i);
end
end
end
end
nilai_NSSD_edge(i) = buff_NSSD;
end
%==========================================
minimal=1;
for i=1:5
nilai_NSSD_akhir(i) = (nilai_NSSD(i)*nilai_NSSD_edge(i));
%nilai_NSSD_akhir(i) = nilai_NSSD(i) + (nilai_NSSD_edge(i)*10000);
if(nilai_NSSD_akhir(i)<nilai_NSSD_akhir(minimal))minimal=i;end
end
bendera_prediksi = minimal;
if nilai_NSSD_akhir(minimal)>threshold_klasifikasi
minimal=0;
end
switch(minimal)
case 0
disp(‘Bendera tidak ada yang cocok’)
switch(bendera_prediksi)
case 1
disp(‘Tapi kalau boleh saya tebak, ini Bendera Itali’)
case 2
disp(‘Tapi kalau boleh saya tebak, ini Bendera Jepang’)
case 3
disp(‘Tapi kalau boleh saya tebak, ini Bendera Korea Selatan’)
case 4
disp(‘Tapi kalau boleh saya tebak, ini Bendera Argentina’)
case 5
disp(‘Tapi kalau boleh saya tebak, ini Bendera India’)
end
case 1
disp(‘Ini Bendera Itali’)
case 2
disp(‘Ini Bendera Jepang’)
case 3
disp(‘Ini Bendera Korea Selatan’)
case 4
disp(‘Ini Bendera Argentina’)
case 5
disp(‘Ini Bendera India’)
end
_______________________NSSD_edge.m
clc;
clear all;
baris = 100;
kolom = 200;
threshold_klasifikasi = 2100; %persentase toleransi kemiripan
input_bendera = imread(‘japan.jpg’);
bendera_normal = imresize(input_bendera,[baris kolom]);
bendera_normal = rgb2gray(bendera_normal);
bendera_normal = edge(bendera_normal,’sobel’);
dir_gambar = [dir(‘itali.jpg’) dir(‘japan.jpg’) dir(‘korea.jpg’) dir(‘argentina.jpg’) dir(‘india.jpg’)];
minimal= 1;
for i=1:5
buff_NSSD = 1000000;
N = baris*kolom;
bendera_source = imread(dir_gambar(i).name);
bendera_source = imresize(bendera_source,[baris kolom]);
bendera_source = rgb2gray(bendera_source);
bendera_source = edge(bendera_source,’sobel’);
bendera_sum = 0;
for n=1 : baris
for m=1 : kolom
bendera_sum = bendera_sum + ((double(bendera_normal(n,m)) – double(bendera_source(n,m)))^2);
end
end
nilai_NSSD(i) = bendera_sum/N;
if nilai_NSSD(i) < buff_NSSD
buff_NSSD = nilai_NSSD(i);
end
nilai_NSSD(i) = buff_NSSD;
if(nilai_NSSD(i)<nilai_NSSD(minimal))minimal=i;end
end
bendera_prediksi = minimal;
if nilai_NSSD(minimal)>threshold_klasifikasi
minimal=0;
end
switch(minimal)
case 0
disp(‘Bendera tidak ada yang cocok’)
switch(bendera_prediksi)
case 1
disp(‘Tapi kalau boleh saya tebak, ini Bendera Itali’)
case 2
disp(‘Tapi kalau boleh saya tebak, ini Bendera Jepang’)
case 3
disp(‘Tapi kalau boleh saya tebak, ini Bendera Korea Selatan’)
case 4
disp(‘Tapi kalau boleh saya tebak, ini Bendera Argentina’)
case 5
disp(‘Tapi kalau boleh saya tebak, ini Bendera India’)
end
case 1
disp(‘Ini Bendera Itali’)
case 2
disp(‘Ini Bendera Jepang’)
case 3
disp(‘Ini Bendera Korea Selatan’)
case 4
disp(‘Ini Bendera Argentina’)
case 5
disp(‘Ini Bendera India’)
end
_______________________ori_2.m
clc;
clear all;
baris = 100;
kolom = 200;
jum_layer = 3;
threshold_klasifikasi = 2100; %persentase toleransi kemiripan
interval_scan_baris = baris/10;
interval_scan_kolom = kolom/10;
input_bendera = imread(‘tes8.jpg’);
bendera_normal = imresize(input_bendera,[baris kolom]);
G = fspecial(‘gaussian’,[15 15],4);
bendera_normal = imfilter(bendera_normal,G,’same’);
dir_gambar = [dir(‘itali.jpg’) dir(‘japan.jpg’) dir(‘korea.jpg’) dir(‘argentina.jpg’) dir(‘india.jpg’)];
minimal= 1;
for i=1:5
buff_NSSD = 1000000;
i
for lipat=1:2
N = (baris/lipat)*(kolom/lipat)*jum_layer;
bendera_source = imread(dir_gambar(i).name);
bendera_source = imresize(bendera_source,[baris/lipat kolom/lipat]);
bendera_source = imfilter(bendera_source,G,’same’);
for scan_y=1:interval_scan_baris:(baris – (baris/(2^(lipat-1))) + 1)
for scan_x=1:interval_scan_kolom:(kolom – (kolom/(2^(lipat-1))) + 1)
bendera_sum = 0;
for layer=1 : jum_layer
for n=1 : baris/lipat
for m=1 : kolom/lipat
bendera_sum = bendera_sum + ((double(bendera_normal((scan_y+n-1),(scan_x+m-1),layer)) – double(bendera_source(n,m,layer)))^2);
end
end
end
nilai_NSSD(i) = bendera_sum/N;
if nilai_NSSD(i) < buff_NSSD
buff_NSSD = nilai_NSSD(i);
end
end
end
end
nilai_NSSD(i) = buff_NSSD;
if(nilai_NSSD(i)<nilai_NSSD(minimal))minimal=i;end
end
bendera_prediksi = minimal;
if nilai_NSSD(minimal)>threshold_klasifikasi
minimal=0;
end
switch(minimal)
case 0
disp(‘Bendera tidak ada yang cocok’)
switch(bendera_prediksi)
case 1
disp(‘Tapi kalau boleh saya tebak, ini Bendera Itali’)
case 2
disp(‘Tapi kalau boleh saya tebak, ini Bendera Jepang’)
case 3
disp(‘Tapi kalau boleh saya tebak, ini Bendera Korea Selatan’)
case 4
disp(‘Tapi kalau boleh saya tebak, ini Bendera Argentina’)
case 5
disp(‘Tapi kalau boleh saya tebak, ini Bendera India’)
end
case 1
disp(‘Ini Bendera Itali’)
case 2
disp(‘Ini Bendera Jepang’)
case 3
disp(‘Ini Bendera Korea Selatan’)
case 4
disp(‘Ini Bendera Argentina’)
case 5
disp(‘Ini Bendera India’)
end
_____________________________ori_2_edge.m
clc;
clear all;
baris = 100;
kolom = 200;
threshold_klasifikasi = 2100; %persentase toleransi kemiripan
interval_scan_baris = baris/10;
interval_scan_kolom = kolom/10;
input_bendera = imread(‘itali.jpg’);
bendera_normal = imresize(input_bendera,[baris kolom]);
bendera_normal = rgb2gray(bendera_normal);
bendera_normal = edge(bendera_normal,’sobel’);
dir_gambar = [dir(‘itali.jpg’) dir(‘japan.jpg’) dir(‘korea.jpg’) dir(‘argentina.jpg’) dir(‘india.jpg’)];
minimal= 1;
for i=1:5
buff_NSSD = 1000000;
for lipat=1:2
N = (baris/lipat)*(kolom/lipat);
bendera_source = imread(dir_gambar(i).name);
bendera_source = imresize(bendera_source,[baris/lipat kolom/lipat]);
bendera_source = rgb2gray(bendera_source);
bendera_source = edge(bendera_source,’sobel’);
for scan_y=1:interval_scan_baris:(baris – (baris/(2^(lipat-1))) + 1)
for scan_x=1:interval_scan_kolom:(kolom – (kolom/(2^(lipat-1))) + 1)
bendera_sum = 0;
for n=1 : baris/lipat
for m=1 : kolom/lipat
bendera_sum = bendera_sum + ((double(bendera_normal((scan_y+n-1),(scan_x+m-1))) – double(bendera_source(n,m)))^2);
end
end
nilai_NSSD(i) = bendera_sum/N;
if nilai_NSSD(i) < buff_NSSD
buff_NSSD = nilai_NSSD(i);
end
end
end
end
nilai_NSSD(i) = buff_NSSD;
if(nilai_NSSD(i)<nilai_NSSD(minimal))minimal=i;end
end
bendera_prediksi = minimal;
if nilai_NSSD(minimal)>threshold_klasifikasi
minimal=0;
end
switch(minimal)
case 0
disp(‘Bendera tidak ada yang cocok’)
switch(bendera_prediksi)
case 1
disp(‘Tapi kalau boleh saya tebak, ini Bendera Itali’)
case 2
disp(‘Tapi kalau boleh saya tebak, ini Bendera Jepang’)
case 3
disp(‘Tapi kalau boleh saya tebak, ini Bendera Korea Selatan’)
case 4
disp(‘Tapi kalau boleh saya tebak, ini Bendera Argentina’)
case 5
disp(‘Tapi kalau boleh saya tebak, ini Bendera India’)
end
case 1
disp(‘Ini Bendera Itali’)
case 2
disp(‘Ini Bendera Jepang’)
case 3
disp(‘Ini Bendera Korea Selatan’)
case 4
disp(‘Ini Bendera Argentina’)
case 5
disp(‘Ini Bendera India’)
end
____________________________ori_3.m
clc;
clear all;
baris = 100;
kolom = 200;
jum_layer = 3;
threshold_klasifikasi = 2200; %persentase toleransi kemiripan
interval_scan_baris = baris/10;
interval_scan_kolom = kolom/10;
prompt = {‘Masukan Nama file gambar:’};
dlg_title = ‘Pilih Gambar’;
num_lines = 1;
def = {‘japan.jpg’};
jawab = inputdlg(prompt,dlg_title,num_lines,def);
input_bendera = imread(jawab{1});
bendera_normal = imresize(input_bendera,[baris kolom]);
G = fspecial(‘gaussian’,[1 1],0.6);
bendera_normal = imfilter(bendera_normal,G,’same’);
dir_gambar = [dir(‘itali.jpg’) dir(‘japan.jpg’) dir(‘korea.jpg’) dir(‘argentina.jpg’) dir(‘india.jpg’)];
for lipat=1:2
buff_NSSD = 1000000;
minimal= 1;
for i=1:5
i
N = (baris/lipat)*(kolom/lipat)*jum_layer;
bendera_source = imread(dir_gambar(i).name);
bendera_source = imresize(bendera_source,[baris/lipat kolom/lipat]);
bendera_source = imfilter(bendera_source,G,’same’);
for scan_y=1:interval_scan_baris:(baris – (baris/(2^(lipat-1))) + 1)
for scan_x=1:interval_scan_kolom:(kolom – (kolom/(2^(lipat-1))) + 1)
bendera_sum = 0;
for layer=1 : jum_layer
for n=1 : baris/lipat
for m=1 : kolom/lipat
bendera_sum = bendera_sum + ((double(bendera_normal((scan_y+n-1),(scan_x+m-1),layer)) – double(bendera_source(n,m,layer)))^2);
end
end
end
if (bendera_sum/N)<buff_NSSD
nilai_NSSD(i) = bendera_sum/N;
else
nilai_NSSD(i) = buff_NSSD;
end
if nilai_NSSD(i)<threshold_klasifikasi
minimal = i;
break;
end
buff_NSSD = bendera_sum/N;
end
if nilai_NSSD(i)<threshold_klasifikasi
break;
end
end
if nilai_NSSD(i)<threshold_klasifikasi
break;
end
if(nilai_NSSD(i)<nilai_NSSD(minimal))minimal=i;end
end
if nilai_NSSD(i)<threshold_klasifikasi
break;
end
end
bendera_prediksi = minimal;
if nilai_NSSD(minimal)>threshold_klasifikasi
minimal=0;
end
switch(minimal)
case 0
switch(bendera_prediksi)
case 1
msgbox(‘Bendera tidak ada yang cocok, tapi kalau boleh saya tebak, itu bendera Itali’, ‘Hasil’)
case 2
msgbox(‘Bendera tidak ada yang cocok, tapi kalau boleh saya tebak, itu bendera Jepang’, ‘Hasil’)
case 3
msgbox(‘Bendera tidak ada yang cocok, tapi kalau boleh saya tebak, itu bendera Korea Selatan’, ‘Hasil’)
case 4
msgbox(‘Bendera tidak ada yang cocok, tapi kalau boleh saya tebak, itu bendera Argentina’, ‘Hasil’)
case 5
msgbox(‘Bendera tidak ada yang cocok, tapi kalau boleh saya tebak, itu bendera India’, ‘Hasil’)
end
case 1
msgbox(‘Bendera Itali’, ‘Hasil’)
case 2
msgbox(‘Bendera Jepang’, ‘Hasil’)
case 3
msgbox(‘Bendera Korea Selatan’, ‘Hasil’)
case 4
msgbox(‘Bendera Argentina’, ‘Hasil’)
case 5
msgbox(‘Bendera India’, ‘Hasil’)
end
______________________________backup5_algo.m
function [ output_args ] = Untitled2( input_args )
%UNTITLED2 Summary of this function goes here
% Detailed explanation goes here
clc
baris = 27;
kolom = 54;
konst_thr_gray = 0.75;
thr_gray = 255*konst_thr_gray;
thr_gray_kemiripan = 21100;
jum_lipat = 3;
jum_layer_rgb = 3;
konst_interval = 1;
interval_scan_baris = 3*konst_interval;
interval_scan_kolom = 6*konst_interval;
%gb input 2 gray
nama_file = [‘itali.jpg’];
gb_input = imread(nama_file);
gb_input = imresize(gb_input,[baris kolom]);
gb_input_gray = rgb2gray(gb_input);
%pertegas gb_gray
for bar=1:baris
for kol=1:kolom
if gb_input_gray(bar,kol)>thr_gray
gb_input_gray(bar,kol)=255;
else
gb_input_gray(bar,kol)=0;
end
end
end
dir_gambar = [dir(‘itali.jpg’) dir(‘japan.jpg’) dir(‘korea.jpg’) dir(‘argentina.jpg’) dir(‘india.jpg’)];
scan_y_buff = [];
scan_x_buff = [];
lipat_buff = [];
gb_urut_buff = [];
actual_baris_buff = [];
actual_kolom_buff = [];
for i=1:5
%input gb source 2 gray
gb_source = imread(dir_gambar(i).name);
gb_source_gray = rgb2gray(gb_source);
for lipat=1:jum_lipat
actual_baris = ((baris/jum_lipat)*(jum_lipat-lipat+1));
actual_kolom = ((kolom/jum_lipat)*(jum_lipat-lipat+1));
N = actual_baris*actual_kolom;
%im resize
gb_source_gray = imresize(gb_source_gray,[actual_baris actual_kolom]);
%pertegas gb_source
for bar=1:actual_baris
for kol=1:actual_kolom
if gb_source_gray(bar,kol)>thr_gray
gb_source_gray(bar,kol)=255;
else
gb_source_gray(bar,kol)=0;
end
end
end
for scan_y=1:interval_scan_baris:(baris-actual_baris+1)
for scan_x=1:interval_scan_baris:(kolom-actual_kolom+1)
bendera_sum = 0;
for n=1 : actual_baris
for m=1 : actual_kolom
bendera_sum = bendera_sum + ((double(gb_input_gray((scan_y+n-1),(scan_x+m-1))) – double(gb_source_gray(n,m)))^2);
end
end
nilai_NSSD(i) = bendera_sum/N;
if nilai_NSSD(i)<thr_gray_kemiripan
scan_y_buff = [scan_y_buff(1:end) scan_y];
scan_x_buff = [scan_x_buff(1:end) scan_x];
lipat_buff = [lipat_buff(1:end) lipat];
actual_baris_buff = [actual_baris_buff(1:end) actual_baris];
actual_kolom_buff = [actual_kolom_buff(1:end) actual_kolom];
gb_urut_buff = [gb_urut_buff(1:end) i];
end
end
end
end
end
loop_rgb = size(gb_urut_buff);
buff_NSSD_tahap2 = 1000000;
minimal_tahap2 = 1;
for i=1:loop_rgb(2)
gb_source = imread(dir_gambar(gb_urut_buff(i)).name);
gb_source_rgb = imresize(gb_source,[actual_baris_buff(i) actual_kolom_buff(i)]);
for layer=1 : jum_layer_rgb
for n=1 : actual_baris_buff(i)
for m=1 : actual_kolom_buff(i)
bendera_sum = bendera_sum + ((double(gb_input((scan_y_buff(i)+n-1),(scan_x_buff(i)+m-1),layer)) – double(gb_source_rgb(n,m,layer)))^2);
end
end
end
nilai_NSSD_tahap2(i) = bendera_sum/N;
if nilai_NSSD_tahap2(i) < buff_NSSD_tahap2
minimal_tahap2 = i;
buff_NSSD_tahap2 = nilai_NSSD_tahap2(i);
end
end
gb_banding_asli = imread(nama_file);
banding_pixel = size(gb_banding_asli);
resize_data_scan_y = scan_y_buff(minimal_tahap2)*(banding_pixel(1)/baris)
resize_data_scan_x = scan_x_buff(minimal_tahap2)*(banding_pixel(2)/kolom)
resize_data_bar = actual_baris_buff(minimal_tahap2)*(banding_pixel(1)/baris)
resize_data_kol = actual_kolom_buff(minimal_tahap2)*(banding_pixel(2)/kolom)
lebar_bound = 1;
for n=1 : resize_data_bar
for m=1 : resize_data_kol
if (n<=lebar_bound) | (n>=(resize_data_bar-lebar_bound)) | (m<=lebar_bound) | (m>=(resize_data_kol-lebar_bound))
gb_banding_asli(ceil(resize_data_scan_y + n – 1),ceil(resize_data_scan_x + m -1),1) = 255;
gb_banding_asli(ceil(resize_data_scan_y + n – 1),ceil(resize_data_scan_x + m -1),2) = 1;
gb_banding_asli(ceil(resize_data_scan_y + n – 1),ceil(resize_data_scan_x + m -1),3) = 1;
end
end
end
figure,imshow(gb_banding_asli);
switch(minimal_tahap2)
case 1
disp(‘Ini Bendera Itali’)
case 2
disp(‘Ini Bendera Jepang’)
case 3
disp(‘Ini Bendera Korea Selatan’)
case 4
disp(‘Ini Bendera Argentina’)
case 5
disp(‘Ini Bendera India’)
end
___________________________NSSD.m
%function [ output_args ] = NSSD( input_args )
clc
clear all
row = 120;
col = 210;
layer_pic = 3;
N = row*col*layer_pic;
threshold = 0.8;
min=1;
input_flag = imread(’11.jpg’);
normal_flag = imresize(input_flag,[row col]);
pic_dir = [dir(‘itali.jpg’) dir(‘japan.jpg’) dir(‘korea.jpg’) dir(‘argentina.jpg’) dir(‘india.jpg’)];
for i=1:5
flag_source = imread(pic_dir(i).name);
flag_source = imresize(flag_source,[row col]);
flag_sum = 0;
for layer = 1 : layer_pic
for n = 1 : row
for m = 1 : col
flag_sum = flag_sum + ((double(normal_flag(n,m,layer)) – double(flag_source(n,m,layer)))^2);
end
end
end
nilai_NSSD(i) = flag_sum/N;
if(nilai_NSSD(i)<nilai_NSSD(min))
min=i;
end
end
bendera = min;
if nilai_NSSD(min)>threshold
min=0;
end
switch(min)
case 0
disp(‘Sepertinya Ini:’)
switch(bendera)
case 1
disp(‘Bendera Itali’)
case 2
disp(‘ini Bendera Jepang’)
case 3
disp(‘ini Bendera Korea Selatan’)
case 4
disp(‘Bendera Argentina’)
case 5
disp(‘Bendera India’)
end
case 1
disp(‘Pasti Ini Bendera Itali’)
case 2
disp(‘Pasti Ini Bendera Jepang’)
case 3
disp(‘Pasti Ini Bendera Korea Selatan’)
case 4
disp(‘Pasti Ini Bendera Argentina’)
case 5
disp(‘Pasti Ini Bendera India’)
end
_________________________________________________
Download semua file project