Deteksi Tepi Dengan Metode Sobel (bagian 2)
Pendahuluan
Citra Sobel
Semoga Bermanfaat
Referensi
Pada tulisan sebelumnya, kita telah membahas ruang lingkup pengolahan citra dan hubungannya dengan Grafika Komputer dan Pengenalan Pola.
Pada tulisan ini, kita akan mempelajari Metode Deteksi Tepi Sobel.
Pada tulisan ini, kita akan mempelajari Metode Deteksi Tepi Sobel.
Dasar Teori
Metode
Sobel adalah sebuah metode pendeteksian tepi yang tergolong kategori gradient edge detection (Murdianto,
2007), dimana metode ini akan mendeteksi nilai maksimum dan nilai minimum dari
tepi sebuah gambar sesuai ditunjukkan pada gambar 1 di bawah ini:
Gambar 1. Pendeteksian Tepi Gambar Asli (a) menjadi Pola
(b)
Apabila threshold (batas) dari sebuah obyek
sudah sesuai dengan nilai yang ditetapkan, maka dapat ditentukan apakah nilai
tersebut merupakan batas dari sebuah obyek atau bukan. Proses pendeteksian ini
dilakukan terhadap seluruh cell matrik dari sebuah citra 2 dimensi. Artinya
sistem akan melakukan mapping terhadap sebuah citra sehingga diperoleh seluruh
tepi dari obyek-obyek dalam citra tersebut.
Setelah
seluruh tepi obyek dari citra tersebut telah dipetakan, proses berikutnya
adalah melakukan penyaringan terhadap obyek yang perlu diolah dan obyek yang
tidak perlu diolah seperti noise
seperti ditunjukkan pada gambar 2 sebagai berikut. Noise pada gambar dapat muncul dari beberapa sebab, kualitas cahaya
saat pengambilan gambar menggunakan kamera, noise
pada obyek yang diambil seperti debu, batu atau obyek-obyek lain yang tidak
seharusnya muncul saat gambar diambil atau bisa juga noise berasal dari kualitas kamera yang digunakan, misalnya kamera
yang tidak memiliki fitur auto focus
sehingga gambar yang diambil memiliki “bayangan” atau duplikasi obyek. Noise pada gambar digital dapat
diperbaiki dengan beberapa tools dari perangkat lunak pengolah citra seperti
Adobe Photoshop dan lain-lain.
Pada Gambar
2 dijelaskan, walaupun pada citra asli (a) memiliki banyak noise baik noise yang berada di latar belakang maupun noise yang berada di dalam obyek,
akan tetapi noise-noise tersebut memiliki dimensi yang
kurang dari nilai yang ditetapkan sebagai sebuah obyek, maka noise tersebut akan dihilangkan dan
terbentuklah pola yang tergambar pada gambar (b).
Noise
adalah gangguan dalam citra yang dapat membuat kesalahan pendeteksian yang
kemudian berujung pada kesalahan pengenalan pola dari citra yang diolah. Noise merupakan tantangan terbesar dalam
konsep pengolahan citra. Sistem dapat mengira noise sebagai obyek (kesalahan negatif) maupun sebaliknya obyek
sebagai noise (kesalahan positif).
Gambar 2.
Pembersihan Noise dari Citra
Metode
deteksi tepi sobel cukup baik dalam pendeteksian noise sebelum noise yang
ada dalam citra tersebut memiliki toleransi yang cukup besar. Pada gambar 2
di atas, noise dipandang sebagai
sebuah obyek yang memiliki dimensi (ukuran) tertentu yang kemudian “diabaikan”
oleh sistem sehingga tidak akan diproses kemudian. Akan tetapi apabila dimensi noise ini melebihi ukuran yang
diijinkan, maka noise tersebut akan
dianggap sebagai sebuah obyek seperti pada gambar 2.8 di atas.
Noise
bisa juga muncul sebagai warna toleransi yang cukup mirip seperti ditunjukkan
pada gambar 3 di bawah ini.
Gambar 3
Hasil pengolahan Citra dengan Metode Deteksi Tepi Sobel
Metode
deteksi tepi Sobel dilakukan dengan operasi matriks terhadap piksel-piksel di
sekitar piksel yang sedang di-scan.
Sebuah citra tersusun atas matriks 2 dimensi yang masing-masing sel matrik tersebut berisi kombinasi warna merah,
hijau dan biru seperti ditunjukkan pada gambar 4 sebagai berikut.
Gambar 4 Matriks Warna dalam
Piksel Gambar 2D
Matriks
Sobel merupakan matriks 3x3 dengan koefisien nilai RGB yang telah ditentukan
seperti pada gambar 5 sebagai berikut.
Gambar 5 Matrik Sobel
Setiap sel
dari matriks di gambar 4 akan diolah menggunakan koefisien matriks di gambar
2.12 sehingga diperoleh jarak antar warna. Jika jarak antar warna tersebut
kurang dari nilai yang ditentukan maka konversi nilai RGB pada pixel tersebut
menjadi putih dan jika lebih dari nilai yang ditentukan, maka konversi nilai
RGB pada pixel tersebut sebagai hitam sehingga diperoleh matriks warna baru
seperti ditunjukkan pada gambar 4 di atas.
Pendeteksian
tepi obyek menggunakan metode Sobel dijelaskan pada diagram alir gambar 6 di
bawah ini:
Gambar 6 Diagram Alir Metode Sobel dalam Penentuan
Warna Piksel
Source Code
Setelah kita memahami Algorima Deteksi Tepi Sobel, kita akan menulis kode program (saya tulis dalam bahasa PHP)
<?php
// Tentukan citra yang akan diolah
$gambar_awal = "coba.jpg";
// pembentukan citra digital
$gambar_digital = imagecreatefromjpeg($gambar_awal);
//Cari dimensi gambar
$data_gambar = getimagesize($gambar_awal);
$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 matrik sobel disekitar piksel yang discan
$piksel_atas = luminansi(imagecolorat($gambar_digital,$x,$y-1));
$piksel_bawah = luminansi(imagecolorat($gambar_digital,$x,$y+1));
$piksel_kiri = luminansi(imagecolorat($gambar_digital,$x-1,$y));
$piksel_kanan = luminansi(imagecolorat($gambar_digital,$x+1,$y));
$piksel_atas_kiri = luminansi(imagecolorat($gambar_digital,$x-1,$y-1));
$piksel_atas_kanan = luminansi(imagecolorat($gambar_digital,$x+1,$y-1));
$piksel_bawah_kiri = luminansi(imagecolorat($gambar_digital,$x-1,$y+1));
$piksel_bawah_kanan = luminansi(imagecolorat($gambar_digital,$x+1,$y+1));
// Hitung nilai x dan y
$rubah_x = ($piksel_atas_kanan+($piksel_kanan*2)+$piksel_bawah_kanan)-($piksel_atas_kiri +($piksel_kiri*2)+$piksel_bawah_kiri);
$rubah_y = ($piksel_atas_kiri+($piksel_atas*2)+$piksel_atas_kanan)-($piksel_bawah_kiri+($piksel_bawah*2)+$piksel_bawah_kanan);
// hitung jarak
$abu_abu = sqrt($rubah_x*$rubah_x+$rubah_y*$rubah_y);
$abu_abu = 255-$abu_abu;
// Proses Menentukan nilai abu-abu
if($abu_abu > 255){
$abu_abu = 255;
}
if($abu_abu < 0){
$abu_abu = 0;
}
$abu_abu_baru = imagecolorallocate($akhir,$abu_abu,$abu_abu,$abu_abu);
imagesetpixel($akhir,$x,$y,$abu_abu_baru);
}
}
// Beritahu browser bahwa ada data citra yang akan ditampilkan
header('Content-Type: image/jpeg');
imagejpeg($akhir);
function luminansi($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;
}
?>
<?php
// Tentukan citra yang akan diolah
$gambar_awal = "coba.jpg";
// pembentukan citra digital
$gambar_digital = imagecreatefromjpeg($gambar_awal);
//Cari dimensi gambar
$data_gambar = getimagesize($gambar_awal);
$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 matrik sobel disekitar piksel yang discan
$piksel_atas = luminansi(imagecolorat($gambar_digital,$x,$y-1));
$piksel_bawah = luminansi(imagecolorat($gambar_digital,$x,$y+1));
$piksel_kiri = luminansi(imagecolorat($gambar_digital,$x-1,$y));
$piksel_kanan = luminansi(imagecolorat($gambar_digital,$x+1,$y));
$piksel_atas_kiri = luminansi(imagecolorat($gambar_digital,$x-1,$y-1));
$piksel_atas_kanan = luminansi(imagecolorat($gambar_digital,$x+1,$y-1));
$piksel_bawah_kiri = luminansi(imagecolorat($gambar_digital,$x-1,$y+1));
$piksel_bawah_kanan = luminansi(imagecolorat($gambar_digital,$x+1,$y+1));
// Hitung nilai x dan y
$rubah_x = ($piksel_atas_kanan+($piksel_kanan*2)+$piksel_bawah_kanan)-($piksel_atas_kiri +($piksel_kiri*2)+$piksel_bawah_kiri);
$rubah_y = ($piksel_atas_kiri+($piksel_atas*2)+$piksel_atas_kanan)-($piksel_bawah_kiri+($piksel_bawah*2)+$piksel_bawah_kanan);
// hitung jarak
$abu_abu = sqrt($rubah_x*$rubah_x+$rubah_y*$rubah_y);
$abu_abu = 255-$abu_abu;
// Proses Menentukan nilai abu-abu
if($abu_abu > 255){
$abu_abu = 255;
}
if($abu_abu < 0){
$abu_abu = 0;
}
$abu_abu_baru = imagecolorallocate($akhir,$abu_abu,$abu_abu,$abu_abu);
imagesetpixel($akhir,$x,$y,$abu_abu_baru);
}
}
// Beritahu browser bahwa ada data citra yang akan ditampilkan
header('Content-Type: image/jpeg');
imagejpeg($akhir);
function luminansi($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;
}
?>
Hasil:
Citra Asli
Semoga Bermanfaat
Referensi
- Murdianto A, Ekstraksi Fitur Wajah dengan Metode Gabor Wavelet, Fasilkom UI, 2007
Boleh minta bantu kak
Kalo ada pertanyaan seputar pengolahan citra silahkan email ke saya, siapa tau saya bisa bantu. :)
pak boleh minta emailnya saya mau tanya2 hehe