31
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 : Intel Core 2 Duo, 2 GHz o RAM : 2 GB
• Perangkat Lunak
o Sistem Operasi : Windows Vista Home Premium o Aplikasi : 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.
1 Im = imread(M); 2 size(Im); 3 tic 4 %pemisahan channel 5 I1 = Im(:,:,1); 6 I2 = Im(:,:,2); 7 I3 = Im(:,:,3); 8
9 %pemberian noise salt&pepper pada tiap channel
10 I1 = imnoise(I1,'salt & pepper', 0.02);
11 I2 = imnoise(I2,'salt & pepper', 0.02);
12 I3 = imnoise(I3,'salt & pepper', 0.02);
13
14 %menggabungkan kembali channel2
15 I(:,:,1) = I1; 16 I(:,:,2) = I2; 17 I(:,:,3) = I3; 18 19 %pinggir 20 It(:,:,1) = pinggir3(I,1); 21 It(:,:,2) = pinggir3(I,2); 22 It(:,:,3) = pinggir3(I,3); 23 24 Itt(:,:,1) = pinggir3(It,1); 25 Itt(:,:,2) = pinggir3(It,2); 26 Itt(:,:,3) = pinggir3(It,3); 27
28 figure; imshow(Im), title('Citra Asli');
29 figure; imshow(I), title('Citra yang diberi noise');
30 Itt=double(Itt);
31
32 %fungsi hybrid vector filtering Gambar 5.1A Listing kode masukan
33 [Ih]=h_filter2(Itt); 34 [NI]=h_filter(Ih); 35 p1=psnr(Im(:,:,1),NI(:,:,1)); 36 p2=psnr(Im(:,:,2),NI(:,:,2)); 37 p3=psnr(Im(:,:,3),NI(:,:,3)); 38 39 snr=(p1+p2+p3)/3 40 toc 41 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 function [Ih] = h_filter2(b)
2 3 C=size(b); 4 5 for n=[2:C(1)-1] 6 for k=[2:C(2)-1] 7 if b(n,k,1)+b(n,k,2)+b(n,k,3)==0 8 b(n,k,:)=1; 9 end
10 end 11 end 12 13 for n=[2:C(1)-1] 14 for k=[2:C(2)-1] 15 r=1; 16 17 for l=[-1:1] 18 for m=[-1:1] 19 Xi(1)=b(n+l,k+m,1); 20 Xi(2)=b(n+l,k+m,2); 21 Xi(3)=b(n+l,k+m,3); 22 mXi(r,:)=Xi; 23 sum_m=0; 24 25 for q=[-1:1] 26 for w=[-1:1] 27 Xj(1)=b(n+q,k+w,1); 28 Xj(2)=b(n+q,k+w,2); 29 Xj(3)=b(n+q,k+w,3); 30 d=Xi-Xj; 31 mag=norm(d); 32 sum_m=sum_m+mag; 33 end 34 end 35 S(r)=sum_m; 36 r=r+1; 37 end 38 end 39 40 VMF=min(S); 41 42 for r=[1:9] 43 if S(r)==VMF
44 rv=r; 45 end 46 end 47 48 NNI(n,k,1)=mXi(rv,1); 49 NNI(n,k,2)=mXi(rv,2); 50 NNI(n,k,3)=mXi(rv,3); 51 52 end 53 end 54 55 NNI=NNI(2:size(NNI,1), 2:size(NNI,2),:); 56 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’.
• 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 function [NI] = h_filter(a);
2 3 B=size(a); 4 a=double(a); 5 6 for n=[2:B(1)-1] 7 for k=[2:B(2)-1] 8 if a(n,k,1)+a(n,k,2)+a(n,k,3)==0 9 a(n,k,:)=1; 10 End 11 end
12 end 13 14 %---VDF 15 for n=[2:B(1)-1] 16 for k=[2:B(2)-1] 17 r=1; 18 19 for l=[-1:1] 20 for m=[-1:1] 21 Xi(1)=a(n+l,k+m,1); 22 Xi(2)=a(n+l,k+m,2); % vektor Xi berupa matrix 3x1 23 Xi(3)=a(n+l,k+m,3); 24 mXi(r,:)=Xi; %matriks vektor Xi disimpan dengan ukuran 3xr
25 sum_a=0; 26 27 28 for q=[-1:1] 29 for w=[-1:1] 30 Xj(1)=a(n+q,k+w,1); 31 Xj(2)=a(n+q,k+w,2); 32 Xj(3)=a(n+q,k+w,3); 33 34 alfa=acos((Xi(1)*Xj(1)+Xi(2)*Xj(2)+Xi(3)*Xj( 3))/(norm(double(Xi))*norm(double(Xj)))); 35 sum_a=sum_a+abs(alfa); 36 end 37 end 38 S(r)=sum_a; 39 r=r+1; 40 end 41 end 42 VDF=min(S);
43 for r=[1:9] 44 if S(r)==VDF 45 rv=r; 46 end 47 end 48 NI(n,k,1)=mXi(rv,1); 49 NI(n,k,2)=mXi(rv,2); 50 NI(n,k,3)=mXi(rv,3); 51 end 52 end 53 54 NI=NI(2:size(NI,1), 2:size(NI,2),:); 55 NI=uint8(NI);
56 figure; imshow(NI), title('Final Result');
57
58 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
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 function p = psnr(x,y) 2
3 % psnr - compute the Peack Signal to Noise Ratio, defined by : 4 % PSNR(x,y) = 10*log10( max(max(x),max(y))^2 / |x-y|^2 ). 5 % 6 % p = psnr(x,y); 7 %
8 % Copyright (c) 2004 Gabriel Peyr 9 x=double(x);
10 y=double(y);
11 d = mean( mean( (x(:)-y(:)).^2 ) ); 12 m1 = max( abs(x(:)) );
13 m2 = max( abs(y(:)) ); 14 m = max(m1,m2);
15
16 p = 10*log10( m^2/d );