Median Filter Untuk Citra RGB
Pendahuluan
Pada bagian berikut, saya langsung tulis script Median Filter dengan penambahan fitur pencatat waku eksekusi.
<?php
//Catat waktu mulainya
$time_start = microtime(true);
// Tentukan citra yang akan diolah
$gambar_awal = "salt_noise.jpg";
// pembentukan citra digital
$gambar_digital = imagecreatefromjpeg($gambar_awal);
// mencari dimensi gambar
$data_gambar = getimagesize($gambar_awal);
//Menyiapkan kanvas untuk citra baru
$akhir = imagecreatetruecolor($data_gambar[0],$data_gambar[1]);
// Proses semua piksel
for($x=1;$x<$data_gambar[0]-1;$x++){
for($y=1;$y<$data_gambar[1]-1;$y++){
$blue_a = blue(imagecolorat($gambar_digital,$x,$y-1));
$blue_b = blue(imagecolorat($gambar_digital, $x, $y+1));
$blue_c = blue(imagecolorat($gambar_digital,$x-1,$y));
$blue_d = blue(imagecolorat($gambar_digital, $x+1, $y));
$blue_e = blue(imagecolorat($gambar_digital,$x-1, $y-1));
$blue_f = blue(imagecolorat($gambar_digital, $x+1, $y-1));
$blue_g = blue(imagecolorat($gambar_digital,$x-1, $y+1));
$blue_h = blue(imagecolorat($gambar_digital, $x+1, $y+1));
Pada materi sebelumnya, kita sudah menerapkan Median Filter untuk citra gray. Tujuan utama menggunakan citra gray adalah sebagai image pre-processing dan bukan sekedar visualisasi saja (sebagai citra yang dinikmati manusia). Image pre-processing digunakan untuk menyiapkan citra sebelum diolah atau diambil informasinya. Salah satu tahapan image pre-processing adalah adalah noise reduction. Beberapa teknik pengolahan citra dan pengenalan pola, menggunakan citra gray (abu-abu) dalam prosesnya. Salah satu alasannya adalah tingginya komputasi yang diperlukan jika menggunakan citra RGB (warna). Citra berwarna dengan salt noise effect ditunjukkan pada Gambar 1 sebagai berikut:
Pengurangan noise menggunakan Median Filter juga bisa diterapkan pada citra berwarna dengan memodifikasi tulisan saya sebelumnya. Saya tidak banyak menyoroti teknis bagaimana algoritma maupun script yang digunakan untuk menerapkan Median Filter pada citra RGB, tetapi saya lebih senang mengamati waktu yang diperlukan untuk mengurangi noise di citra berwarna dibandingkan dengan citra abu-abu.
Metode Pengujian
Pada bagian ini, kita akan menyepakati bagaimana proses perhitungan waktu eksekusi metode Median Filter pada Citra RGB dan Citra Gray. Diagram alir untuk proses perhitungan waktunya ditunjukkan pada gambar 2 sebagai berikut:
Listing Program
Gambar 1. Citra RGB dengan Salt Noise Effect
Pengurangan noise menggunakan Median Filter juga bisa diterapkan pada citra berwarna dengan memodifikasi tulisan saya sebelumnya. Saya tidak banyak menyoroti teknis bagaimana algoritma maupun script yang digunakan untuk menerapkan Median Filter pada citra RGB, tetapi saya lebih senang mengamati waktu yang diperlukan untuk mengurangi noise di citra berwarna dibandingkan dengan citra abu-abu.
Metode Pengujian
Pada bagian ini, kita akan menyepakati bagaimana proses perhitungan waktu eksekusi metode Median Filter pada Citra RGB dan Citra Gray. Diagram alir untuk proses perhitungan waktunya ditunjukkan pada gambar 2 sebagai berikut:
Gambar 2. Skema Pengujian
Listing Program
Pada bagian berikut, saya langsung tulis script Median Filter dengan penambahan fitur pencatat waku eksekusi.
<?php
//Catat waktu mulainya
$time_start = microtime(true);
// Tentukan citra yang akan diolah
$gambar_awal = "salt_noise.jpg";
// pembentukan citra digital
$gambar_digital = imagecreatefromjpeg($gambar_awal);
// mencari dimensi gambar
$data_gambar = getimagesize($gambar_awal);
//Menyiapkan kanvas untuk citra baru
$akhir = imagecreatetruecolor($data_gambar[0],$data_gambar[1]);
// Proses semua piksel
for($x=1;$x<$data_gambar[0]-1;$x++){
for($y=1;$y<$data_gambar[1]-1;$y++){
// Hitung semua nilai RGB di sekitar piksel yang discan
$red_a = red(imagecolorat($gambar_digital,$x,$y-1));
$red_b = red(imagecolorat($gambar_digital, $x, $y+1));
$red_c = red(imagecolorat($gambar_digital,$x-1,$y));
$red_d = red(imagecolorat($gambar_digital, $x+1, $y));
$red_e = red(imagecolorat($gambar_digital,$x-1, $y-1));
$red_f = red(imagecolorat($gambar_digital, $x+1, $y-1));
$red_g = red(imagecolorat($gambar_digital,$x-1, $y+1));
$red_h = red(imagecolorat($gambar_digital, $x+1, $y+1));
$green_a = green(imagecolorat($gambar_digital,$x,$y-1));
$green_b = green(imagecolorat($gambar_digital, $x, $y+1));
$green_c = green(imagecolorat($gambar_digital,$x-1,$y));
$green_d = green(imagecolorat($gambar_digital, $x+1, $y));
$green_e = green(imagecolorat($gambar_digital,$x-1, $y-1));
$green_f = green(imagecolorat($gambar_digital, $x+1, $y-1));
$green_g = green(imagecolorat($gambar_digital,$x-1, $y+1));
$green_h = green(imagecolorat($gambar_digital, $x+1, $y+1));
$red_a = red(imagecolorat($gambar_digital,$x,$y-1));
$red_b = red(imagecolorat($gambar_digital, $x, $y+1));
$red_c = red(imagecolorat($gambar_digital,$x-1,$y));
$red_d = red(imagecolorat($gambar_digital, $x+1, $y));
$red_e = red(imagecolorat($gambar_digital,$x-1, $y-1));
$red_f = red(imagecolorat($gambar_digital, $x+1, $y-1));
$red_g = red(imagecolorat($gambar_digital,$x-1, $y+1));
$red_h = red(imagecolorat($gambar_digital, $x+1, $y+1));
$med_red = median($red_a,$red_b,$red_c,$red_d,$red_e,$red_f,$red_g,$red_h);
$green_a = green(imagecolorat($gambar_digital,$x,$y-1));
$green_b = green(imagecolorat($gambar_digital, $x, $y+1));
$green_c = green(imagecolorat($gambar_digital,$x-1,$y));
$green_d = green(imagecolorat($gambar_digital, $x+1, $y));
$green_e = green(imagecolorat($gambar_digital,$x-1, $y-1));
$green_f = green(imagecolorat($gambar_digital, $x+1, $y-1));
$green_g = green(imagecolorat($gambar_digital,$x-1, $y+1));
$green_h = green(imagecolorat($gambar_digital, $x+1, $y+1));
$med_green = median($green_a,$green_b,$green_c,$green_d,$green_e,$green_f,$green_g,$green_h);
$blue_a = blue(imagecolorat($gambar_digital,$x,$y-1));
$blue_b = blue(imagecolorat($gambar_digital, $x, $y+1));
$blue_c = blue(imagecolorat($gambar_digital,$x-1,$y));
$blue_d = blue(imagecolorat($gambar_digital, $x+1, $y));
$blue_e = blue(imagecolorat($gambar_digital,$x-1, $y-1));
$blue_f = blue(imagecolorat($gambar_digital, $x+1, $y-1));
$blue_g = blue(imagecolorat($gambar_digital,$x-1, $y+1));
$blue_h = blue(imagecolorat($gambar_digital, $x+1, $y+1));
$med_blue = median($blue_a,$blue_b,$blue_c,$blue_d,$blue_e,$blue_f,$blue_g,$blue_h);
//menempatkan nilai median pada kanvas
$color_new=imagecolorallocate($akhir,$med_red,$med_green,$med_blue);
imagesetpixel($akhir,$x,$y,$color_new);
}
}
// Tampilkan Citra lama dan citra baru
imagejpeg($akhir, 'salt_noise2.jpg', 100);
echo "<img src=salt_noise.jpg>";
echo "<img src=salt_noise2.jpg>";
//Catat waktu selesai
$time_end = microtime(true);
//Hitung lama waktu eksekusinya
$time = $time_end - $time_start ;
echo '<p>Waktu eksekusi = ' . $time . ' seconds' ;
function red($pixel){
$pixel = sprintf('%06x',$pixel);
$red = hexdec(substr($pixel,0,2));
return $red;
}
function green($pixel){
$pixel = sprintf('%06x',$pixel);
$green = hexdec(substr($pixel,2,2));
return $green;
}
function blue($pixel){
$pixel = sprintf('%06x',$pixel);
$blue = hexdec(substr($pixel,4));
return $blue;
}
function median($a,$b,$c,$d,$e,$f,$g,$h) {
$nilai_tetangga = array($a,$b,$c,$d,$e,$f,$g,$h);
sort($nilai_tetangga);
$bawah = $nilai_tetangga[3];
$atas = $nilai_tetangga[4];
$abu_abu = floor(($bawah+$atas)/2);
return $abu_abu;
}
?>
$color_new=imagecolorallocate($akhir,$med_red,$med_green,$med_blue);
imagesetpixel($akhir,$x,$y,$color_new);
}
}
// Tampilkan Citra lama dan citra baru
imagejpeg($akhir, 'salt_noise2.jpg', 100);
echo "<img src=salt_noise.jpg>";
echo "<img src=salt_noise2.jpg>";
//Catat waktu selesai
$time_end = microtime(true);
//Hitung lama waktu eksekusinya
$time = $time_end - $time_start ;
echo '<p>Waktu eksekusi = ' . $time . ' seconds' ;
function red($pixel){
$pixel = sprintf('%06x',$pixel);
$red = hexdec(substr($pixel,0,2));
return $red;
}
function green($pixel){
$pixel = sprintf('%06x',$pixel);
$green = hexdec(substr($pixel,2,2));
return $green;
}
function blue($pixel){
$pixel = sprintf('%06x',$pixel);
$blue = hexdec(substr($pixel,4));
return $blue;
}
function median($a,$b,$c,$d,$e,$f,$g,$h) {
$nilai_tetangga = array($a,$b,$c,$d,$e,$f,$g,$h);
sort($nilai_tetangga);
$bawah = $nilai_tetangga[3];
$atas = $nilai_tetangga[4];
$abu_abu = floor(($bawah+$atas)/2);
return $abu_abu;
}
?>
Hasil Percobaan
Berikut adalah Citra Gray yang telah dibersihkan noisenya menggunakan Median Filter beserta waktu eksekusinya.
Data Uji
- Nama: salt_noise.jpg
- Dimension: 480 x 361 pixel
- Size: 80.050 bytes
Gambar 3 Pengolahan Citra Gray
Gambar 4. Pengolahan Citra RGB
Gambar 5. Hasil Pengujian
Kesimpulan
Pengolahan Citra RGB memiliki rata-rata waktu lebih lama dibandingkan Citra Gray.
Semoga Bermanfaat