Image Enhancement dengan Median Filter
Pendahuluan
Median Filter adalah salah satu teknik dalam pengolahan citra pada domain spasial yang dapat digunakan untuk peningkatan kualitas citra (image enhancement) terutama mengurangi noise (distorsi) pada sebuah citra.
Sering kalanya citra yang akan kita proses memiliki kualitas yang kurang baik sehingga menyulitkan dalam proses pengolahan dan dapat berakibat sulitnya mengenali informasi dalam citra tersebut (pattern recognition). Kekurangbaikan citra tersebut bisa diakibatkan banyaknya informasi gangguan (noise) yang muncul pada sebuah gambar yang harus dikurangi terlebih dulu.
Contoh kualitas citra yang kurang baik.
Gambar 1. Gambar Dengan Banyak Noise
Domain spasial merupakan salah satu domain pengolahan citra yang memanipulasi sekumpulan picture element (pixel) dari sebuah citra sehingga menghasilkan nilai baru. Sekumpulan pixel yang dimaksud adalah 8 pixel tetangga dari pixel yang akan diproses. Ke-8 pixel tetangga ditunjukkan pada Gambar 2 sebagai berikut:
Gambar 2. Delapan Pixel Tetangga
Pixel tengah (x,y) akan diolah (manipulated) menggunakan 8 nilai tetangga pada domain 3x3. Nilai baru yang akan muncul "diakui" sebagai nilai baru yang menggantikan nilai asli sehingga diharapkan diperolehnya sebuah nilai pixel yang "menyerupai" nilai tetangganya dan pada akhirnya dapat meningkatkan kualitas citra.
Algoritma
Proses manipulasi pixel tengah dilakukan dengan mencari nilai tengah (median) dari 8 titik pixel di sekitarnya. Diagram alir untuk mencari nilai median dari 8 pixel tetangga ditunjukkan Gambar 3 sebagai berikut:
Gambar 3. Diagram Alir Mencari Nilai Median
Fungsi PHP untuk mengambil nilai abu-abu adalah sebagai berikut:
function gray($pixel){
$pixel = sprintf('%06x',$pixel);
$red = hexdec(substr($pixel,0,2))*0.30;
$green = hexdec(substr($pixel,2,2))*0.59;
$blue = hexdec(substr($pixel,4))*0.11;
return $red+$green+$blue;
}
fungsi PHP untuk mencari median adalah sebagai berikut:
function mencari_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;
}
$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;
}
dimana nilai $a, $b, $c, $d, $e, $f, $g, $h adalah nilai gray (abu-abu) pada pixel (x-1,y+1), (x,y+1), (x+1,y+1), (x-1,y), (x+1,y), (x-1,y-1), (x,y-1), (x+1,y-1) pada Gambar 2. Nilai yang di-return pada fungsi ini menggantikan nilai pixel abu-abu pada koordinat (x,y). Lakukan proses ini untuk semua pixel pada citra. Diagram alir keseluruhan Median Filter ditunjukkan pada Gambar 4 sebagai berikut:
Gambar 4. Diagram Alir Median Filter Pengolahan Citra
Listing Program
Setelah kita pahami proses median filter pada penjelasan di atas, saatnya menulis kode program. Kode program untuk median filter adalah sebagai berikut:
<?php
// Tentukan citra yang akan diolah
$gambar_awal = "lena.jpg";
// pembentukan citra digital
$gambar_digital = imagecreatefromjpeg($gambar_awal);
// mencari dimensi gambar
$data_gambar = getimagesize($gambar_awal);
// Tentukan citra yang akan diolah
$gambar_awal = "lena.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 abu-abu di sekitar piksel yang discan
$a = gray(imagecolorat($gambar_digital,$x,$y-1));
$b = gray(imagecolorat($gambar_digital, $x, $y+1));
$c = gray(imagecolorat($gambar_digital,$x-1,$y));
$d = gray(imagecolorat($gambar_digital, $x+1, $y));
$e = gray(imagecolorat($gambar_digital,$x-1, $y-1));
$f = gray(imagecolorat($gambar_digital, $x+1, $y-1));
$g = gray(imagecolorat($gambar_digital,$x-1, $y+1));
$h = gray(imagecolorat($gambar_digital, $x+1, $y+1));
//menghitung median
$b = gray(imagecolorat($gambar_digital, $x, $y+1));
$c = gray(imagecolorat($gambar_digital,$x-1,$y));
$d = gray(imagecolorat($gambar_digital, $x+1, $y));
$e = gray(imagecolorat($gambar_digital,$x-1, $y-1));
$f = gray(imagecolorat($gambar_digital, $x+1, $y-1));
$g = gray(imagecolorat($gambar_digital,$x-1, $y+1));
$h = gray(imagecolorat($gambar_digital, $x+1, $y+1));
//menghitung median
$abu_abu = mencari_median($a,$b,$c,$d,$e,$f,$g,$h);
//tanam nilai abu-abu tersebut pada kanvas yang sudah kita siapkan
$abu_new=imagecolorallocate($akhir,$abu_abu,$abu_abu,$abu_abu);
//tanam nilai abu-abu tersebut pada kanvas yang sudah kita siapkan
$abu_new=imagecolorallocate($akhir,$abu_abu,$abu_abu,$abu_abu);
imagesetpixel($akhir,$x,$y,$abu_new);
}
}
// Tampilkan Citra lama dan citra baru
imagejpeg($akhir, 'bagus.jpg', 100);
echo "<img src=lena.jpg>";
echo "<img src=bagus.jpg>";
function gray($pixel){
$pixel = sprintf('%06x',$pixel);
$red = hexdec(substr($pixel,0,2))*0.30;
$green = hexdec(substr($pixel,2,2))*0.59;
$blue = hexdec(substr($pixel,4))*0.11;
return $red+$green+$blue;
}
function mencari_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;
}
}
}
// Tampilkan Citra lama dan citra baru
imagejpeg($akhir, 'bagus.jpg', 100);
echo "<img src=lena.jpg>";
echo "<img src=bagus.jpg>";
function gray($pixel){
$pixel = sprintf('%06x',$pixel);
$red = hexdec(substr($pixel,0,2))*0.30;
$green = hexdec(substr($pixel,2,2))*0.59;
$blue = hexdec(substr($pixel,4))*0.11;
return $red+$green+$blue;
}
function mencari_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
Gambar 5. Hasil Median Filter 1x
Jika proses ini diulang akan menghasilkan hasil seperti ditunjukkan pada gambar 6 sebagai berikut.
Gambar 6. Proses Median Filter 2x dan 3x
Bagaimana dengan Citra RGB beserta perbandingan waktu eksekusi antara Citra Gray dengan Citra RGB akan dijelaskan apda meteri berikutnya.
Semoga Bermanfaat. Selamat Mencoba..