Powered By google

Selasa, 26 November 2013

Pendeteksi Tepi Citra Dengan Metode Canny Menggunakan OpenCV



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
  
   2.   Kemudian pilih menu yang paling atas yaitu "Install Visual Studio 2008", lalu klik
   3.   Tunggulah hingga progressbar selesai loading sehingga muncul tombol "Next"
 4.   Kemudian klik tombol "Next" di atas
 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"
  6.   Pilih saja fitur "Default" sesuai rekomendasi sistem. Jika, tampilan Anda sudah sesuai dengan  
       gambar di atas. Silakan klik tombol "Install"
7.  Inilah proses instalasi komponen, tunggulah beberapa menit hingga proses benar- benar selesai
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:
  
Penyusun:
ABIMANYU RIO Y. (4IA03)
FITRA REZA (4IA03)

Versi Lengkapnya disini

Referensi:

1 komentar:

sangat menarik tulisannya.. ada referensinya gk gan?

Posting Komentar

Twitter Delicious Facebook Digg Stumbleupon Favorites More