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 :
- Penghalusan untuk mengurangi dampak noise terhadap pendeteksian edge
- Menghitung potensi gradien citra
- non-maximal supression dari gradien citra untuk melokalisasi edge secara presisi
- 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:
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