Upload
bajajreza
View
873
Download
7
Embed Size (px)
DESCRIPTION
Pendeteksi Tepi Citra Dengan Metode CannyMenggunakan OpenCV
Citation preview
UNIVERSITAS GUNADARMA
FAKULTAS TEKNOLOGI INDUSTRI
Pendeteksi Tepi Citra Dengan Metode Canny
Menggunakan OpenCV
2013
Nama : - Abimanyu Rio Y.
- Fitra Reza
Kelas : 4IA03
Fakultas : Teknologi Industri
Jurusan : Teknik Informatika
Dosen : Eri Prasetyo Wibowo
Penjelasan Umum:
Metode edge detection akan mendeteksi semua edge atau garis-garis yang
membentuk objek gambar dan akan memperjelas kembali pada bagian-bagian tersebut.
Tujuan pendeteksian ini adalah bagaimana agar objek di dalam gambar dapat dikenali dan
disederhanakan bentuknya dari bentuk sebelumnya. Metode Canny edge detection
merupakan pengembangan dari metode dasar edge detection. Perancangan sebuah prosedur
dengan menerapkan langkah-langkah metode Canny edge detection akan menghasilkan
sebuah tampilan gambar yang berbeda dengan menampilkan efek relief didalamnya. Efek
relief adalah seperti sebuah tampilan batu kasar yang diukir, yaitu garis-garis kasar yang
membentuk sebuah penggambaran objek di dalamnya. Efek relief terbentuk dari bayangan
terang dan gelap. Kedua bayangan ini terjadi akibat adanya sorotan sinar mengenai gambar
dari arah tertentu. Kelebihan dari metode Canny ini adalah kemampuan untuk mengurangi
noise sebelum melakukan perhitungan deteksi tepi sehingga tepi-tepi yang dihasilkan lebih
banyak.
Tepi (edge) adalah perubahan nilai intensitas derajat keabuan yang cepat atau tiba-
tiba (besar) dalam jarak yang singkat. Tujuan mendeteksi tepi sendiri adalah untuk
mengelompokkan objek-objek dalam citra, dan juga digunakan untuk menganalisis citra
lebih lanjut. Ada banyak algoritma yang digunakan untuk mendeteksi tepi, salah satu
diantaranya adalah deteksi tepi Canny (Canny Edge detection).
Canny edge detector dikembangkan oleh John F. Canny pada tahun 1986 dan
menggunakan algoritma multi-tahap untuk mendeteksi berbagai tepi dalam gambar.
Walaupun metode tersebut telah berumur cukup lama, namun metode tersebut telah menjadi
metode deteksi tepi standar dan masih dipakai dalam penelitan.
Algoritma
Algoritma canny edge detection secara umum (detilnya tidak baku atau bisa divariasikan)
beroperasi sebagai berikut :
1. Penghalusan untuk mengurangi dampak noise terhadap pendeteksian edge
2. Menghitung potensi gradien citra
3. non-maximal supression dari gradien citra untuk melokalisasi edge secara presisi
4. hysteresis thresholding untuk melakukan klasifikasi akhir
Penghalusan citra
Biasanya teknik yang digunakan pada tahap ini adalah Gaussian Blur. Proses Gaussian Blur
dapat dilakukan terhadap citra secara keseluruhan (hasil akhir berupa 1 citra baru), atau
dilakukan terpisah (hasil akhir berupa dua buah citra yaitu blur horizontal dan vertikal). Hasil
dari gaussian blur akan digunakan dalam langkah selanjutnya yaitu menentukan potensi
gradien citra.
Menghitung potensi gradien citra
Gradien merupakan operator yang paling mendekati definisi dari sebuah edge. Oleh sebab itu
dalam kuliah pengolahan citra, operator berbasis turunan menjadi materi pengantar. Ada dua
buah operator yang akan saya sebutkan dalam tulisan ini yaitu operator Sobel dan Kirsch
(silakan cari sendiri deskripsi kedua operator ini ). Kedua operator ini mewakili dua buah
pendekatan yang memiliki landasan ide yang berbeda dalam menghitung gradien.
Pada langkah menghitung potensi gradien citra ada dua buah informasi yang dibutuhkan yaitu
kekuatan edge (edge strength/magnitude), dan arah edge (edge direction/orientation). Operator
sobel memanfaatkan dua buah template edge pada dua arah tegak lurus (horizontal dan vertikal)
dan menghitung arah edge dari arctangent kedua nilai tersebut. Lain halnya dengan operator
Kirsch yang menggunakan template sebanyak delapan yang mewakili 8 arah sehingga orientasi
edge dapat ditunjukkan oleh template dengan respon magnitudo terbesar.
Non-maximal Supression
Hasil penerapan operator gradien untuk menghitung potensi gradien di tahap sebelumnya tidak
memberi informasi secara spesifik tentang lokasi dari edge yang dicari. Alternatifnya adalah
menggunakan operator zero-crossing yang digunakan oleh algoritma deteksi Marr-Hildreth.
Non-maximal supression bertujuan membuang potensi gradien di suatu piksel dari kandidat
edge jika piksel tersebut bukan merupakan maksimal lokal pada arah edge di posisi piksel
tersebut (di sinilah arah gradien diperlukan).
Hysteresis thresholding
Hasil dari langkah non-maximal suppression adalah citra yang berisi kandidat edge serta
intensitas dari kekuatan edge di posisi piksel tersebut. Langkah terakhir adalah thresholding
atau klasifikasi tiap piksel apakah termasuk dalam kategori piksel edge atau tidak. Pada tahap
ini bisa saja menggunakan threshold yang berdasarkan pada satu nilai tertentu. Namun
pemilihan threshold yang hanya menggunakan satu nilai ini memiliki keterbatasan yaitu adanya
kemungkinan piksel yang hilang padahal sebetulnya meruapakan piksel edge (false-negative)
ataupun dimasukkannya piksel yang sebetulnya merupakan noise sebagai piksel edge (false-
positive). Oleh sebab itu dalam melakukan klasifikasi tidak hanya diperlukan intensitas dari
kekuatan edge sebagai pertimbangan namun juga topologi (keterhubungan antar-piksel) lokal
dari piksel tersebut.
Sederhananya hysteresis thresholding adalah klasifikasi dengan dua buah nilai High-threshold
dan Low-Threshold. suatu piksel disahkan sebagai piksel edge jika nilainya lebih besar atau
sama dengan High-Threshold (thresholding umum) atau (di sini kaidah tambahannya) jika
piksel tersebut memiliki intensitas kekuatan edge yang lebih besar dari Low-Threshold dan
terhubung dengan piksel yang nilainya lebih besar dari High-Threshold. Untuk menentukan
keterhubungan suatu piksel dengan piksel lainnya digunakan teknik yang dinamakan edge-
linking yang pada dasarnya sama dengan flood-fill
Instalasi Software
Dalam pembuatan aplikasi pengolahan citra, penulis menggunakan perangkat lunak berikut:
1. Microsoft Visual C++
Microsoft Visual C++ adalah software yang digunakan sebagai compiler. Compiler adalah
perangkat lunak yang digunakan untuk mengubah source code dari suatu bahasa
pemrograman (dalam kasus ini bahasa pemrogramannya yaitu C++) menjadi native code /
bahasa mesin (file executable) agar dapat dieksekusi oleh komputer. Microsoft Visual C++
ini dibuat oleh perusahaan Microsoft.
2. OpenCV
OpenCV (Open Computer Vision) merupakan semacam library yang digunakan dalam
membuat aplikasi yang berkaitan dengan computer vision. OpenCV juga menyediakan
banyak fungsionalitas, yang tentunya dapat mempersingkat waktu dalam pembuatan aplikasi
yang lumayan rumit.
Instalasi Microsoft Visual Studio 2008
Adapun langkah-langkah instalasi MS Visual Studio 2008 sebagai berikut:
1. Masukkan DVD software MS Visual Studio 2008 kedalam DVD Room PC/laptop
Anda, kemudian akan muncul auto run CD. Jika tidak muncul maka klik file
Setup.exe atau jika anda mendownload software MS Visual Studio langsung saja klik
setup sehingga muncul seperti gmbar aberikut ini :
2. Kemudian pilih menu yang paling atas yaitu "Install Visual Studio 2008", lalu klik
sehingga muncul seperti gambar berikut ini :
3. Tunggulah hingga progressbar selesai loading sehingga muncul tombol "Next" seperti
gambar berikut ini :
4. Kemudian klik tombol "Next" di atas sehingga muncul seperti gambar berikut ini :
5. Karena penulis menggunakan lisensi yang disediakan oleh kantor teman saya, maka
secara otomatis product key number akan terisi. Jangan lupa pilih "I have read and
accept the license terms" lalu klik tombol "Next" lagi sehingga muncul seperti gambar
berikut ini :
6. Pilih saja fitur "Default" sesuai rekomendasi sistem. Jika, tampilan Anda sudah sesuai
dengan gambar di atas. Silakan klik tombol "Install" sehingga muncul seperti gambar
berikut ini :
7. Inilah proses instalasi komponen, tunggulah beberapa menit hingga proses benar-
benar selaesai. Lalu muncul seperti gambar berikut ini :
8. Instalasi telah selesai dilakukan maka klik tombol "Finish".
Instalasi OpenCV
1. Download terlebih dahulu software OpenCv 2.4.6
2. Setelah selesai download kita akan akan muncul jendela instalasi klik saja next maka
kita akan masuk ke proses ekstrak, seperti gambar dibawah ini :
3. Tunggu sampai proses ekstraksi selesai maka OpenCV sudah terinstall dan dapat
digunakan.
Konfigurasi Pengaturan OpenCV Pada Visual Studio
1. Untuk melakukan konfigurasi pada OpenCv kita bisa melakukannya dengan masuk ke File
-> New -> Project
2. Setelah itu pilih Win32 Console Application
3. Beri nama Deteksi_tepi (ini dapat diganti sesuka kita)
4. Setelah itu kita setting Project Directories
Klik kanan project>>Properties >>Linker >>Input >>
release
opencv_features2d246.lib
opencv_highgui246.lib
opencv_core246.lib
opencv_imgproc246.lib
opencv_ml246.lib
opencv_objdetect246.lib
opencv_video246.lib
opencv_contrib246.lib
opencv_calib3d246.lib
debug
opencv_features2d246.lib
opencv_highgui246d.lib
opencv_core246d.lib
opencv_imgproc246d.lib
opencv_ml246d.lib
opencv_objdetect246d.lib
opencv_video246d.lib
opencv_contrib246d.lib
opencv_calib3d246d.lib
Klik Tools -> Options -> Projects and Solutions -> VC++ Directories ->
Library
C:\opencv\build\x86\vc9\lib
Include
C:\opencv\build\include
C:\opencv\include\opencv
Logika Program:
#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
Perintah include diatas merupakan prepocessor yang digunakan untuk melampirkan file
header
int high_switch_value = 0;
int highInt = 0;
int low_switch_value = 0;
int lowInt = 0;
Untuk mendeklarasikan variabel dengan tipe integer.
void switch_callback_h( int position ){
highInt = position;
}
void switch_callback_l( int position ){
lowInt = position;
}
Untuk mendeklarasikan fungsi deteksi tepi yang dimana posisinya dibagi menjadi 2 yaitu low
dan high
IplImage* img = cvLoadImage( "rame.jpg", 0 ); //nama gambar adalah rame.jpg
IplImage* img_b = cvCreateImage( cvSize(img->width+N-1,img->height+N-1), img-
>depth, img->nChannels );
IplImage* out = cvCreateImage( cvGetSize(img_b), IPL_DEPTH_8U, img_b->nChannels );
Untuk menyisipkan gambar yang akan diproses deteksi tepinya dengan nama rame.jpg
CvPoint offset = cvPoint((N-1)/2,(N-1)/2);
cvCopyMakeBorder(img, img_b, offset, IPL_BORDER_REPLICATE, cvScalarAll(0));
Untuk menambahkan garis border
cvNamedWindow( name, 1 );
Untuk membuat sebuah window
int aperature_size = N;
double lowThresh = 20;
double highThresh = 40;
Pendeklasian variable ukuran aperature dimana untuk low adalah 20 dan high 40
cvCreateTrackbar( "High", name, &high_switch_value, 4, switch_callback_h );
cvCreateTrackbar( "Low", name, &low_switch_value, 4, switch_callback_l );
while( 1 ) {
switch( highInt ){
case 0:
highThresh = 200;
break;
case 1:
highThresh = 400;
break;
case 2:
highThresh = 600;
break;
case 3:
highThresh = 800;
break;
case 4:
highThresh = 1000;
break;
}
switch( lowInt ){
case 0:
lowThresh = 0;
break;
case 1:
lowThresh = 100;
break;
case 2:
lowThresh = 200;
break;
case 3:
lowThresh = 400;
break;
case 4:
lowThresh = 600;
break;
}
Untuk membuat sebuah trackbars dimana terdapat 4 pilihan deteksi tepi pada settingan low
dan high
cvCanny( img_b, out, lowThresh*N*N, highThresh*N*N, aperature_size );
cvShowImage(name, out);
if( cvWaitKey( 15 ) == 27 )
break;
}
Perintah diatas sebagai proses deteksi tepi menggunakan canny tranformation
cvReleaseImage( &img );
cvReleaseImage( &img_b );
cvReleaseImage( &out );
cvDestroyWindow( name );
return 0;
}
Program telah selesai dan siap melepas resourcenya
Listing Program:
#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
int high_switch_value = 0;
int highInt = 0;
int low_switch_value = 0;
int lowInt = 0;
void switch_callback_h( int position ){
highInt = position;
}
void switch_callback_l( int position ){
lowInt = position;
}
int _tmain(int argc, _TCHAR* argv[])
{
const char* name = "Edge Detection Window";
// ukuran kernel
int N = 7;
// Set up images
IplImage* img = cvLoadImage( "rame.jpg", 0 ); //nama gambar adalah rame.jpg
IplImage* img_b = cvCreateImage( cvSize(img->width+N-1,img->height+N-1), img->depth,
img->nChannels );
IplImage* out = cvCreateImage( cvGetSize(img_b), IPL_DEPTH_8U, img_b->nChannels );
// menambahkan garis border
CvPoint offset = cvPoint((N-1)/2,(N-1)/2);
cvCopyMakeBorder(img, img_b, offset, IPL_BORDER_REPLICATE, cvScalarAll(0));
// Membuat Window
cvNamedWindow( name, 1 );
// Variable
int aperature_size = N;
double lowThresh = 20;
double highThresh = 40;
// Membuat trackbars
cvCreateTrackbar( "High", name, &high_switch_value, 4, switch_callback_h );
cvCreateTrackbar( "Low", name, &low_switch_value, 4, switch_callback_l );
while( 1 ) {
switch( highInt ){
case 0:
highThresh = 200;
break;
case 1:
highThresh = 400;
break;
case 2:
highThresh = 600;
break;
case 3:
highThresh = 800;
break;
case 4:
highThresh = 1000;
break;
}
switch( lowInt ){
case 0:
lowThresh = 0;
break;
case 1:
lowThresh = 100;
break;
case 2:
lowThresh = 200;
break;
case 3:
lowThresh = 400
break;
case 4:
lowThresh = 600;
break;
}
// Proses deteksi tepi menggunakan canny tranformation
cvCanny( img_b, out, lowThresh*N*N, highThresh*N*N, aperature_size );
cvShowImage(name, out);
if( cvWaitKey( 15 ) == 27 )
break;
}
// Program selesai dan melepas resource
cvReleaseImage( &img );
cvReleaseImage( &img_b );
cvReleaseImage( &out )
cvDestroyWindow( name );
return 0;
}
Output:
Referensi:
http://pebbie.wordpress.com/
http://dosen.publikasistmikibbi.lppm.org
http://www.tenouk.com/
http://adhit8.blogspot.com/