BAB V IMPLEME TASI Pada bab ini akan dipaparkan mengenai proses implementasi mulai dari lingkungan implementasi sampai list kode MATLAB yang digunakan dalam pembuatan aplikasi HVF. 5.1 Lingkungan Implementasi Lingkungan aplikasi pada implementasi program HVF ini adalah: •
•
Perangkat Keras o CPU o RAM
: Intel Core 2 Duo, 2 GHz : 2 GB
Perangkat Lunak o Sistem Operasi o Aplikasi
: Windows Vista Home Premium : MATLAB 7.1
5.2 Implementasi Proses Masukan Masukan pada proses (gambar 5.2) ini yaitu berupa citra RGB, yang kemudian akan diberikan noise pada setiap channelnya dengan persentase yang sama pada tiap-tiap channelnya. Kemudian citra yang telah diberi noise akan ditambahkan pinggirannya sebesar 1 piksel (baris ke 20-26), hal ini dimaksudkan supaya noise yang berada pada tepi citra dapat terproses juga. Pada proses ini juga akan memanggil proses ‘h_filter2’ dan ‘h_filter’ (baris ke 33-34) yaitu proses VMF dan VDF. Setelah itu citra keluaran dari proses VDF akan dihitung PSNR-nya dengan membandingan citra keluaran dengan citra asli. 31
32 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
Im = imread(M); size(Im); tic %pemisahan channel I1 = Im(:,:,1); I2 = Im(:,:,2); I3 = Im(:,:,3); %pemberian noise salt&pepper pada channel I1 = imnoise(I1,'salt & pepper', 0.02); I2 = imnoise(I2,'salt & pepper', 0.02); I3 = imnoise(I3,'salt & pepper', 0.02);
tiap
%menggabungkan kembali channel2 I(:,:,1) = I1; I(:,:,2) = I2; I(:,:,3) = I3; %pinggir It(:,:,1) = pinggir3(I,1); It(:,:,2) = pinggir3(I,2); It(:,:,3) = pinggir3(I,3); Itt(:,:,1) = pinggir3(It,1); Itt(:,:,2) = pinggir3(It,2); Itt(:,:,3) = pinggir3(It,3); figure; imshow(Im), title('Citra Asli'); figure; imshow(I), title('Citra yang diberi noise'); Itt=double(Itt);
30 31 32 %fungsi hybrid vector filtering
Gambar 5.1A Listing kode masukan
33 33 34 35 36 37 38 39 40 41
[Ih]=h_filter2(Itt); [NI]=h_filter(Ih); p1=psnr(Im(:,:,1),NI(:,:,1)); p2=psnr(Im(:,:,2),NI(:,:,2)); p3=psnr(Im(:,:,3),NI(:,:,3)); snr=(p1+p2+p3)/3 toc clear all Gambar 5.1B Listing Kode Masukan
5.3 Implementasi Proses VMF Pada proses VMF (gambar 5.3) ini tiap-tiap piksel pada citra akan diperlakukan sebagai vektor, pada VMF proses yang dilakukan adalah menghitung jarak antara vektor Xi, dan Xj dalam window lokal yang berukuran 3x3 yang kemudian di iterasi sebanyak ukuran citra masukan. Kemudian dicari nilai hasil penjumlahan ‘sum_m’ yang terkecil jika ditemukan nilai ‘sum_m’ yang bernilai minimum maka, posisi ‘r’ akan dicatat dan nilai vektor yang ada pada posisi ‘r’ akan disimpan pada matriks ‘Ih’ 1 2 3 4 5 6 7 8 9
function [Ih] = h_filter2(b) C=size(b); for n=[2:C(1)-1] for k=[2:C(2)-1] if b(n,k,1)+b(n,k,2)+b(n,k,3)==0 b(n,k,:)=1; end Gambar 5.2A Lisitng kode VMF
34 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
end end for n=[2:C(1)-1] for k=[2:C(2)-1] r=1; for l=[-1:1] for m=[-1:1] Xi(1)=b(n+l,k+m,1); Xi(2)=b(n+l,k+m,2); Xi(3)=b(n+l,k+m,3); mXi(r,:)=Xi; sum_m=0; for q=[-1:1] for w=[-1:1] Xj(1)=b(n+q,k+w,1); Xj(2)=b(n+q,k+w,2); Xj(3)=b(n+q,k+w,3); d=Xi-Xj; mag=norm(d); sum_m=sum_m+mag; end end S(r)=sum_m; r=r+1; end end VMF=min(S); for r=[1:9] if S(r)==VMF Gambar 5.2B Listing kode VMF
35 44 45 46 47 48 49 50 51 52 53 54 55 56
rv=r; end end NNI(n,k,1)=mXi(rv,1); NNI(n,k,2)=mXi(rv,2); NNI(n,k,3)=mXi(rv,3); end end NNI=NNI(2:size(NNI,1), 2:size(NNI,2),:); Ih = uint8(NNI); Gambar 5.2C Listing Kode VMF
Penjelasan dari gambar 5.3 : • • •
Baris 17 dan 18 adalah looping untuk vektor Xi dalam window mask yang berukuran 3x3 Baris 25 dan 26 adalah looping untuk vektor Xj dalam window mask yang berukuran 3x3 Baris ke 22 menyimpan nilai vektor Xi dalam matriks mXi dengan ukuran 3 x r. Dimana r adalah indeks pada matriks mXi.
•
Baris ke 31 adalah fungsi untuk menghitung jarak antara vektor Xi dan Xj, yang kemudian hasilnya di jumlahkan dan hasil penjumlahannya dinyatakan dalam variabel bernama ‘sum_m’ (baris 32)
•
Baris ke 35, nilai ‘sum_m’ disimpan ke dalam matriks S(r), dimana ‘r’ disini berfungsi sebagai indeks untuk nilai ‘sum_m’ pada matriks S. Kemudian pada S dicari nilai ‘sum_m’ terkecil yang posisinya ditandai oleh ‘r’. Ketika nilai ‘sum_m’ terkecil ditemukan maka ‘r’ akan diganti menjadi ‘rv’.
36 •
Baris ke 48-50 adalah mengganti nilai (n,k) dengan nilai mXi(rv), dimana rv tadi adalah posisi vektor dengan nilai θ yang minimum. Vektor hasil proses tersebut kemudian disusun kedalam matriks NNI, yang akan digunakan untuk masukan proses selanjutnya yaitu proses VDF.
5.4 Implementasi Proses VDF Pada bagian ini akan dijelaskan mengenai implementasi pada proses VDF beserta listing kode MATLAB-nya. Data masukan untuk proses VDF (gambar 5.4) ini adalah matriks ‘Ih’ yang merupakan keluaran dari proses VMF. Pada VDF, proses yang dilakukan adalah menghitung total jumlah sudut antara vektor Xi, dan Xj dalam window lokal yang berukuran 3x3 yang kemudian di iterasi sebanyak ukuran citra masukan. Kemudian dicari nilai hasil penjumlahan ‘sum_a’ yang terkecil jika ditemukan nilai ‘sum_a’ yang bernilai minimum maka, posisi ‘r’ akan dicatat dan nilai vektor yang ada pada posisi ‘r’ akan disimpan pada matriks ‘NI’, dimana NI adalah citra keluaran dari proses HVF ini. 1 2 3 4 5 6 7 8 9 10 11
function [NI] = h_filter(a); B=size(a); a=double(a); for n=[2:B(1)-1] for k=[2:B(2)-1] if a(n,k,1)+a(n,k,2)+a(n,k,3)==0 a(n,k,:)=1; End end Gambar 5.3A Listing kode VDF
37 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
end %------------------------------------VDF for n=[2:B(1)-1] for k=[2:B(2)-1] r=1; for l=[-1:1] for m=[-1:1] Xi(1)=a(n+l,k+m,1); Xi(2)=a(n+l,k+m,2); % vektor Xi berupa matrix 3x1 Xi(3)=a(n+l,k+m,3); mXi(r,:)=Xi; %matriks vektor Xi disimpan dengan ukuran 3xr sum_a=0;
for q=[-1:1] for w=[-1:1] Xj(1)=a(n+q,k+w,1); Xj(2)=a(n+q,k+w,2); Xj(3)=a(n+q,k+w,3); alfa=acos((Xi(1)*Xj(1)+Xi(2)*Xj(2)+Xi(3)*Xj( 3))/(norm(double(Xi))*norm(double(Xj)))); sum_a=sum_a+abs(alfa); end end S(r)=sum_a; r=r+1; end end VDF=min(S); Gambar 5.3B Listing kode VDF
38 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
for r=[1:9] if S(r)==VDF rv=r; end end NI(n,k,1)=mXi(rv,1); NI(n,k,2)=mXi(rv,2); NI(n,k,3)=mXi(rv,3); end end NI=NI(2:size(NI,1), 2:size(NI,2),:); NI=uint8(NI); figure; imshow(NI), title('Final Result'); NI=double(NI); Gambar 5.3C Listing Kode VDF
Penjelasan dari gambar 5.4 : • Baris 6-12 adalah error handling, dimana jika nilai vektor pada posisi (n,k) = 0 maka nilainya diganti menjadi 1. Tujuannya adalah untuk menghindari pembagian dengan 0 ketika mencari nilai sudut vektor Xi dan Xj •
Baris ke 24 menyimpan nilai vektor Xi dalam matriks mXi dengan ukuran 3 x r. Dimana r adalah indeks pada matriks mXi ketika nilai sum_a bernilai minimum
•
Baris ke 34 adalah fungsi untuk menghitung ‘alfa’ yaitu sudut antara vektor Xi dan Xj, yang kemudian hasilnya di jumlahkan (baris 35) dan hasilnya disimpan dalam variabel sum_a. Yang mana nantinya akan dicari nilai sum_a terkecil yang akan digunakan sebagai directional vector nya.
•
Baris ke 38, nilai ‘sum_a’ disimpan ke dalam matriks S(r). Kemudian dicari nilai ‘sum_a’ terkecil pada ‘S’. Setelah
39 diketahui nilai ‘sum_a’ yang terkecil kemudian nilai ‘r’ yang menandai posisi ‘sum_a’ tersebut diganti menjadi ‘rv’ (baris 45). •
Baris ke 48-50 adalah mengganti nilai (n,k) dengan nilai mXi(rv), dimana rv tadi adalah posisi vektor dengan nilai α minimum. Vektor hasil proses tersebut kemudian disimpan pada matriks NI. Dimana NI adalah citra keluaran dari VDF yang juga merupakan keluaran dari proses HVF.
5.5 PS R Pada gambar 5.4 adalah lisitng kode untuk mencari nilai PSNR dari citra hasil promrosesan (NI) dengan citra awal (Im). Listing kode yang dipakai pada perangkat lunak ini diciptakan oleh Gabriel Peyr. PSNR dari tiap-tiap channel citra keluaran dihitung secara terpisah kemudian diambil nilai rata-ratanya sehingga: PSNR = (PSNR(R) + PSNR(G) + PSNR(B)) / 3 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
function p = psnr(x,y) % psnr - compute the Peack Signal to Noise Ratio, defined by : % PSNR(x,y) = 10*log10( max(max(x),max(y))^2 / |x-y|^2 ). % % p = psnr(x,y); % % Copyright (c) 2004 Gabriel Peyr x=double(x); y=double(y); d = mean( mean( (x(:)-y(:)).^2 ) ); m1 = max( abs(x(:)) ); m2 = max( abs(y(:)) ); m = max(m1,m2); p = 10*log10( m^2/d ); Gambar 5.4 Listing kode PSNR