COMPUTER VISION HOUGH TRANSFORM LINE UNTUK MENDETEKSI GARIS BERBASIS OPENCV
Oleh :
Ahmad Hanafi
( 1204505007 )
Ngurah Padang Adnyana Adnyana
( 1204505015 )
Krishna Anugrah Pratama
( 1204505023 )
Setyo Hadi Kusumo
( 1204505039 )
Jurusan Teknologi Informasi Fakultas Teknik – Universitas Universitas Udayana 2014
1.
H ough ough Tr ansform ansform
Hough Transform (HT) Transform (HT) didesain untuk menemukan garis pada suatu citra. HT diperkenalkan oleh Paul Hough pada tahun 1962. Hough Transform adalah sebuah metode yang dapat digunakan untuk mengisolasi feature tertentu dalam sebuah citra. Metode Hough Transform biasanya digunakan untuk mendeteksi bentuk geometri yang dapat dispesifikasikan dalam bentuk parametrik seperti garis, lingkaran, elips, dan lain – lain. lain. Metode yang digunakan dalam HT adalah membuat persamaan dari suatu piksel dan mempertimbangkan semua pasangan yang memenuhi persamaan tersebut. Semua pasangan ditempatkan pada suatu larik akumulator, yang disebut larik transformasi (Mc Andrew, 2004).
1.1.
H ough ough T ransform ransform Li ne
Teori dasar Hough Transform Transform menggunakan bentuk parametrik dan menggunakan pemungutan suara terbanyak ( voting ) untuk menentukan nilai parameter yang tepat. Apabila dalam citra terdapat beberapa garis yang saling berpotongan pada suatu titik, maka apabila kemudian titik tersebut terse but ditransformasi ke dalam ruang parameter m - c kemudian untuk mengetahui transformasi titik tersebut adalah sebuah garis lurus atau bukan dilakukan voting dengan persamaan garis yang dinyatakan dalam persamaan (1.1). y i i = mx i + c
(1.1)
Di dalam sebuah citra yang terdapat garis lurus maka garis tersebut mempunyai persamaan yang sama dengan persamaan (1.1), maka apabila ditransformasi ke dalam ruang parameter m - c akan diperoleh hasil beberapa garis yang saling berpotongan dalam suatu titik. Persamaan transf ormasi diperoleh dengan cara memanipulasi persamaan garisnya yaitu persamaan (1.1) menjadi bentuk parametrik menjadi persamaan (1.2). c = y i i - mx i
(1.2)
Misalnya dari persamaan garis 4x + 3y = 12 kita dapat menggambar grafiknya pada koordinat Cartesius, dengan cara:
Langkah pertama adalah membuat table koordinat dan cukup dipilih dua pasangan koordinat yang mudah, yaitu titik potong terhadap sumbu x dan sumbu y.
Jika diubah menjadi persamaan c = y – mx menjadi: 4 = y – ( -4/3x) atau 4 = y + 4/3x
Titik potong terhadap sumbu x, y = 0 y + 4/3x
= 4
0 + 4/3x
= 4
4/3x
= 4
x
= 3, didapat titik (3, 0)
Titik potong terhadap sumbu y, x = 0 y + 4/3x
= 4
y+0
= 4
y
= 4, didapat titik (0, 4)
Jadi hasil grafik kartesian persamaan 4x + 3y = 12 terlihat seperti gambar 1.
Gambar 1. Grafik kartesian persamaan 4x + 3y =12
Permisalan lain, terdapat 3 buah titik pada sebuah garis lurus. Sembarang garis yang melalui titik (x1, y1) berkoresponden dengan garis c = y1 – mx1 pada ruang parameter m-c. Begitu juga, sembarang garis lurus yang melalui (x2, y2) berkoresponden dengan garis c = y2 – mx2 dan sembarang garis lurus yang melalui (x3, y3) berkoresponden dengan garis c = y3 – mx3 pada ruang m-c.
Perpotongan (m’, c’) dari ketiga garis pada ruang m -c tersebut menentukan garis unik yang melalui (xi, yi), i = 1, 2, 3, di bidang X-Y. Dengan cara ini, maka setiap pixel pada garis lurus di bidang citra berkoresponden dengan sejumlah garis lurus yang melalui satu ititik tertentu di ruang parameter m-c. Sifat ini dimanfaatkan untuk mendeteksi garis lurus. Jika setiap pixel tepi melakukan “pemungutan suara” pada ruang parameter, maka keberadaan garis lurus pada citra ditandai dengan penumpukan suara pada tempattempat tertentu di ruang parameter.\
Gambar 2. (a) Garis lurus pada ruang X-Y; (b) representasinya dalam ruang parameter m-c.
Dalam kenyataannya, apabila ditemui sebuah garis vertikal, maka akan terjadi masalah dalam penghitungannya dikarenakan garis vertikal mempunyai nilai gradien kemiringan yang besarnya tak berhingga (
∞
). Sebagai
alternatifnyadigunakan persamaan (1.3). r = x cos θ + y sin θ
(1.3)
Dimana gambar koordinat kartesiannya ditunjukkan pada Gambar 1. Sebuah titik B dalam gambar 1 apabila ditransformasi ke dalam ruang parameter r - θ maka akan menjadi seperti gambar 2.
Gambar 3. Citra sebuah garis dalam
Gambar 4. Hasil transformasi dari satu titik
koordinat Kartesian dengan satu titik uji
uji dalam ruang parameter r - θ
Apabila di dalam citra terdapat suatu garis lurus, maka jika garis lurus citra ditransformasi kedalam ruang parameter r - θ akan terjadi suatu titik penumpukan antar kurva sinusoida hasil pentransformasian masing-masing komponen piksel garis yang membentuk garis lurus tersebut.
1.2.
H ough Tr anform Line dalam OpenCV
Hough Transform Line merupakan transformasi citra yang digunakan untuk mendetaksi garis lurus. Untuk menerapkannya harus dilakukan deteksi tepi terlebih dahulu terhadap sebuah citra, umumnya menggunakan Canny Edge Detection. Setelah dilakukan deteksi tepi barulah dapat dilakukan operasi Hough Transform Line. Berikut ini cara kerja dari Hough Transform Line. 1.
Umumnya untuk setiap titik ), jenis garis yang melewati titik tersebut dapat didefinisikan seperti persamaan (1.3), yaitu sebagai berikut:
(2.1)
Artinya bahwa setiap pasang ( ) menunjukkan setiap garis yang melewati ). 2.
Jika untuk koordinat ( ) dilakuakan plot jenis garis yang melewati koordinat tersebut, didapatkan sinusoidnya. Sebagai contoh, untuk = 8 dan = 6 didapatkanlah plot sebagai berikut (dalam diagram - ):
Gambar 5. diagram –
Hanya mempertimbangkan titik sehingga > 0 dan 0 < < . 3.
Dapat dilakukan operasi seperti di atas untuk semua titik dalam sebuah citra. Jika kurva dari 2 titik yang berbeda berpotongan dalam diagram
– , hal itu berarti bahwa kedua titik memiliki garis yang sama. Misalnya, berikut berdasarkan contoh pada gambar 3 dan menggambar plot untuk dua yang lain: = 9, = 4 dan = 12, = 3, didapatkan:
Gambar 6. diagram – dengan tambahan 2 titik lain
Tiga plot berpotongan di satu titik tunggal ( 0.925, 9.6), koordinat ini adalah parameter (, ) atau garis di mana ) , ( , ), dan ( , ) berada. 4.
Dari tahapan di atas, umumnya suatu garis dapat terdeteksi dengan menemukan jumlah perpotongan antara kurva. Semakin banyak kurva yang berpotongan berarti garis yang ditunjukkan oleh perpotongan tersebut memiliki lebih banyak titik. Secara umum dapat ditentukan treshold (batas) jumlah minimun perpotongan yang diperlukan untuk mendeteksi sebuah garis.
5.
Inilah yang dilakukan Hough Tranform, yaitu menyimpan
track
perpotongan antara kurva dari setiap titik dalam citra. Jika jumlah perpotongan di atas treshold (batas), maka dinyatakanlah sebagai garis dengan parameter (, ) pada titik perpotongan.
OpenCV mendukung 2 jenis Hough Transform Line, yaitu: Standard Hough Transform (SHT) dan Progressive Probabilistic Hough Transform (PPHT). 1.
Standard Hough Transform (SHT)
SHT ini terdiri dalam cukup banyak tahapan kerja seperti apa yang dijelaskan sebelumnya. Hough Transform jenis ini memberikan hasil sebuah vektor dari pasangan ( , ). 2.
Progressive Probabilistic Hough Transform (PPHT) Sebuah implementasi yang lebih efisien dari Line Hough Transform. PPHT adalah variasi dari algoritma SHT. PPHT memberikan output ekstrem garis terdeteksi , ). PPHT dikatakan “ probabilistic” ,
karena, daripada mengakumulasikan setiap kemungkinan baris pada akumulator, lebih baik mengakumulasi hanya sebagian kecilnya saja. Dasarnya adalah bahwa sebuah puncak akan menjadi cukup tinggi bagaimanapun juga, kemudian dengan mengenainya maka dengan sedikit kecil waktu akan cukup untuk menemukannya. Hasil dari dugaan ini dapat menjadi substantial reduction (pengurangan besar) pada waktu komputasi.
Di dalam OpenCV, kedua algroritma tersebut (SHT dan PPHT) diakses dengan fungsi yang sama, meskipun maksud dari beberapa argumen bergantung pada metode yang digunakan. Berikut ini adalah kode program fungsi Hough Transform Line pada OpenCV. CvSeq* cvHoughLines2( CvArr* image, void* line_storage, int method, double rho, double theta, int threshold, double param1 = 0, double param2 = 0 ); Kode program 1. Fungsi Hough Transform Line pada OpenCV
Penjelasan dari masing-masing argumen dalam Fungsi Hough Transform Line pada OpenCV pada kode program 1 adalah sebagi berikut: 1.
CvArr*
image, argumen pertama adalah citra masukan. Citra masuka
harus berupa citra 8-bit oleh karena itu citra harus diubah menjadi citra keabuan terlabih dahulu dengan fungsi cvCvtColor pada OpenCV. Citra masukan diperlakukan sebagai informasi biner (yaitu, semua piksel yang
bukan nol dianggap setara) sehingga sebelumnya perlu dilakukan deteksi tepi menggunakan Canny Edge Detection dengan fungsi cvCanny pada OpenCV. 2.
void* line_storage, argumen kedua adalah pointer ke tempat di mana
hasilnya dapat disimpan, yang dapat berupa penyimpanan memori (menggunakan tipe CvMemoryStorage) atau matriks array sederhana N-by1 (jumlah baris, N, akan menampung hingga batas maksimum garis yang menjadi hasil return). 3.
int method, argumen ketiga adalah metode Hough Transform Line, dapat
berupa CV_HOUGH_STANDARD, CV_HOUGH_PROBABILISTIC , atau CV_HOUGH_ MULTI_SCALE untuk (berturut-turut) SHT, PPHT, atau varian multiskala
dari SHT. 4.
double rho dan double theta, argumen keempat ini mengatur resolusi
yang diinginkan untuk baris (yaitu, resolusi akumulator). Satuan rho adalah piksel dan unit theta adalah radian. Dengan demikian, akumulator dapat dianggap sebagai histogram dua dimensi dengan sel-sel rho dimensi piksel dengan radian theta. 5.
int threshold, argumen kelima yang merupakan nilai threshold adalah
nilai pada akumulator yang harus dicapai untuk perulangan hingga menghasilkan sebuah garis. 6.
double param1 = 0 dan double param2 = 0, argumen terakhir ini tidak
digunakan oleh SHT. Untuk PPHT,
param1
menentukan panjang
minimum dari segmen garis yang akan dijadikan kembalian dan param2 menentukan jarak antara segmen kesegarisan (collinear segment ) secara algortima bukan untuk mengganbungkannya menjadi segmen tunggal yang lebih panjang. Untuk multiscale HT , kedua parameter ini digunakan mengindikasikan resolusi yang lebih tinggi bagaimana parameter garis sepatutnya dikomputasi. Multiscale HT terlebih dahulu melakukan komputasi lokasi garis dengan akurasi yang diberikan oleh parameter rho dan theta kemudian menghaluskan hasilnya berdasarkan faktor param1 dan param2 secara berurutan.
Jika nilai line_storage adalah pointer ke sebuah memori, * maka nilai return akan berupa pointer ke struktur urutan CvSeq. Dalam hal ini, bisa mendapatkan setiap baris atau segmen garis dari urutan dengan perintah seperti berikut: float* line = (float*) cvGetSeqElem( lines , i ); Kode program 2. Penggunaan fungsi cvGetSeqElem
Di mana garis adalah nilai return dari cvHoughLines2() dan i adalah indeks dari garis tujuan. Dalam hal ini, garis akan menjadi pointer ke data untuk garis tersebut, dengan garis [0] dan garis [1] menjadi nilai floating-point ρ dan θ (untuk SHT dan MSHT) atau struktur CvPoint untuk titik akhir dari segmen (untuk PPHT).
Gambar 7. Perbedaan hasil trasformasi Hough Transform Line, citra asli (kiri), hasil SHT
(tengah), hasil PPHT (kanan)
2.
Implementasi H ough Transform L ine Menggunakan OpenCV
Algoritma yang digunakan pada Hough Transform Line untuk mendeteksi garis dijelaskan melalui flowchart berikut :
Mulai
Pembacaan Citra
Pembacaan citra asli menjadi citra aras keabuan
Deteksi tepi
Operasi Hough Transform Line
Deteksi dan rekonstruksi garis lurus
Selesai
Gambar 8. Flowchart Aplikasi Transformasi Hough Untuk Deteksi Garis Lurus
Kode program dari algoritma yang digunakan pada Hough Transform Line untuk mendeteksi garis sesuai gambar 5 adalah sebagai berikut : Kode Program
Keterangan
#include #include #include int main(){
/* load the image */ IplImage* img = cvLoadImage("./segitiga.jpg"); bmp
//jpg –
/* create image to receive image processing result */ IplImage* img1 = cvCreateImage(cvSize(img->height, img>width),IPL_DEPTH_8U,1);
Menyertakan header yang digunakan dalam program Tag pembuakan fungsi main (fungsi utama program) Memuat image yang akan diproses menggunakan hough transform garis dalam variabel img Membuat image kosong yang nantinya akan menampung hasil proses pengolahan dari masing-
IplImage* img2 = cvCreateImage(cvSize(img->height, img>width),IPL_DEPTH_8U,1); IplImage* img3 = cvCreateImage(cvSize(img->height, img>width),IPL_DEPTH_8U,1);
/* convert to grayscale */ cvCvtColor( img, img1, CV_RGB2GRAY); /* canny edge detection */ cvCanny( img1, img2, 0, 5, 3 );
/* create storage memory for cvHoughLines2(...) result */ CvMemStorage* storage = cvCreateMemStorage(0); /* Standar Hough Transform Line */ CvSeq* houghLinesSHT = cvHoughLines2( img2, storage, CV_HOUGH_STANDARD, 1, CV_PI/180, 100, 0, 0 );
cvCvtColor( img, img3, CV_RGB2GRAY); // background of the result of Standar Hough Transform Lin is Gray Scale of image for( int i = 0; i < MIN(houghLinesSHT->total,100); i++ ) { float* line = (float*)cvGetSeqElem(houghLinesSHT,i); float rho = line[0]; float theta = line[1]; CvPoint pt1, pt2; double a = cos(theta), b = sin(theta); double x0 = a*rho, y0 = b*rho; pt1.x = cvRound(x0 + 1000*(-b)); pt1.y = cvRound(y0 + 1000*(a)); pt2.x = cvRound(x0 - 1000*(-b)); pt2.y = cvRound(y0 - 1000*(a)); cvLine( img3, pt1, pt2, CV_RGB(255,0,0), 3, CV_AA ); }
masing tahap, img1 untuk hasil konversi ke citra Gray Scale, img2 untuk hasil deteksi tepi menggunakan operasi Canny Edge, img3 untuk hasil Hough Transform garis. Konversi citra asal (img ) menjadi citra Gray Scale (img1) Deteksi tepi manggunakan fungsi Canny terhadap img1 yang hasilnya ditampung di img2 Membuat porinter storage untuk alokasi memori hasil transformasi Operasi Standard Hough Transform (SHT) garis terhadap img2 yang hasilnya ditampung dalam alokasi memori pada variabel storage Rekonstruksi hasil SHT garis kedalam img3
/* Progressive Probabilistic Hough Operasi Progressive Transform Line */ Probabilistic Hough CvSeq* houghLinesPPHT = cvHoughLines2( img2, storage, Transform (PPHT) garis CV_HOUGH_PROBABILISTIC, 1, CV_PI/180, 50, terhadap img2 yang 50, 10 );
hasilnya ditampung dalam alokasi memori pada variabel storage
/* draw line into image Progressive Probabilistic Hough Transform Line */ cvCvtColor( img, img4, CV_RGB2GRAY); // background of the result of Progressive Probabilistic Hough Transform Line is Gray Scale of image for( int i = 0; i < houghLinesPPHT>total; i++ ) { CvPoint* line = (CvPoint*)cvGetSeqElem(houghLinesPPHT,i); cvLine( img4, line[0], line[1], CV_RGB(255,0,0), 3, CV_AA ); } //cvNamedWindow("ImagenColor", 1); cvShowImage("ImagenColor", img); //cvNamedWindow("Gray", 1); cvShowImage("Gray", img1);
Rekonstruksi hasil PPHT garis kedalam img4
Menampilkan image hasil pengolahan pada layar jendela.
//cvNamedWindow("CannyEdge", 1); cvShowImage("CannyEdge", img2); //cvNamedWindow("Standar Hough Transform Line", 1); cvShowImage("Standar Hough Transform Line", img3); //cvNamedWindow("Progressive Probabilistic Transform Line", 1); cvShowImage("Progressive Probabilistic Hough Transform Line", img4); cvWaitKey(0);
cvReleaseImage(&img); cvReleaseImage(&img1); cvReleaseImage(&img2); cvReleaseImage(&img3); cvReleaseImage(&img4); cvDestroyWindow("ImagenColor"); cvDestroyWindow("CannyEdge");
Menunggu user untuk menekan tombol agar program berhenti, 0 berarti dalam batasan waktu yang tak terhingga Mengosongkan alokasi memori yang digunakan untuk menampilkan image Mengosongkan
alokasi
cvDestroyWindow("Gray"); cvDestroyWindow("Hough Transform Line"); cvDestroyWindow("Progressive Probabilistic Transform Line");
memori yang digunakan untuk membuat layar jendela image
}
Tag penutup fungsi main. Kode program 3. Kode program implementasi Hough Transform Line
Metode proses yang digunakan dalam Hough Transform Line mendeteksi suatu garis pada objek berdasarkan algoritma flowchart pada gambar 5 dapat dijelaskan sebagai berikut : 1.
Pembacaan berkas citra Pembacaan berkas citra dilakukan untuk membaca citra asli yang menjadi
source gambar suatu objek. Citra (image) itu sendiri memiliki arti secara harfiah yaitu sebagai gambar pada bidang dua dimensi (dwi matra). Ditinjau dari sudut pandang matematis, citra merupakan fungsi menerus (continue) dari intensitas cahaya pada bidang dua dimensi. 2.
Pembacaan citra asli menjadi citra aras keabuan Setelah dilakukan pembacaan citra, dilanjutkan dengan pengubahan citra
menjadi citra aras keabuan. Supaya citra digital bisa diolah oleh komputer, maka citra digital harus mempunyai format tertentu. Format citra digital yang dipakai adalah citra skala keabuan (Grayscale). Format citra ini disebut skala keabuan karena pada umumnya warna yang dipakai warna hitam sebagai warna minimal (0) dan warna putih (255) sebagai warna maksimalnya, sehingga warna antaranya adalah abu-abu.
Gambar 9. Citra Gr ay scale
3.
Deteksi tepi Deteksi tepi bertujuan untuk meningkatkan penampakan tepi pada citra.
Suatu objek dapat dengan mudah dideteksi pada suatu citra jika objek cukup kontras dari latak belakangnya. Pada proses deteksi tepi ini hasilnya adalah berupa citra biner yang hanya memiliki dua nilai aras keabuan saja yaitu hitam dan putih, dimana aras keabuan putih menunjukkan batas tepi. Metode deteksi tepi yang digunakan adalah metode Canny. Mengapa demikian ? Karena deteksi tepi Canny memiliki algoritma yang optimal dalam melakukan pendeteksian tepi.
Untuk
meningkatkan metode-metode yang telah ada dalam pendeteksian tepi, algortima deteksi tepi Canny mengikuti beberapa kriteria sebagai berikut: a. Tingkat error yang rendah. Error terjadi bila ada tepi yang penting tetapi tidak muncul, atau bila ada yang bukan tepi tetapi muncul. b. Titik-titik pada tepi dilokasikan dengan benar. Dengan kata lain, jarak antara piksel-piksel tepi yang ditemukan algoritma dengan tepi sesungguhnya diminimumkan. c. Hanya satu respon (lebar 1 piksel) untuk setiap sebuah tepi. Berdasarkan kriteria di atas, algoritma deteksi tepi Canny dilakukan dengan langkah-langkah sebagai berikut: a. Pertama-tama
dilakukan
menghilangkan noise.
penghalusan
( smoothing )
citra
untuk
Contohnya menggunakan filtering dengan
Gaussian Filter . b. Selanjutnya dicari gradient magnitude citra untuk melihat daerahdaerah yang memiliki turunan spasial yang tinggi. Pencarian gradient magnitude dapat menggunakan metode Sobel, Prewitt, dan lain lain. c. Ditentukan arah dari tepi dengan menggunakan invers tangen dari gradient magnitude Y (Gy) dibagi gradient magnitude X (Gx). Arah yang diperoleh dari perhitungan ini kemudian dipetakan ke 0, 45, 90, atau 135 derajat berdasarkan kedekatannya dengan keempat derajat arah tadi. d. Kemudian dilakukan Non Maximum Suppression. Yaitu, penghilangan nilai-nilai yang tidak maksimum. Ditelusuri daerah yang ditemukan
pada langkah 2 (dengan arah seperti yang ditemukan pada langkah 3), dan menghilangkan (suppress) setiap piksel yang tidak maksimum. e. Selanjutnya dilakukan Hysteresis. Hysteresis menggunakan dua threshold T1 (threshold bawah) dan T2 (threshold atas).
Bila
magnitude ada di bawah T1, titik tersebut di-set nol (dijadikan nontepi). Bila magnitude ada di atas T2, maka termasuk tepi.
Bila
magnitude ada diantara T1 dan T2, di- set nol kecuali jika ada jalan ( path) dari titik tersebut ke titik yang memiliki magnitude di atas T2.
Gambar 10. Citra Hasil Deteksi Tepi
4.
Operasi Hough Transform Line Pada proses operasi hough transform ini berfungsi untuk menampung citra
dalam bentuk koordinat berdasarkan hasil deteksi tepi menggunakan metode canny. Sebelum menentukan garis lurus, citra yang telah melalui proses deteksi tepi akan terlebih dahulu di tampung di dalam variabel storage pada program. 5.
Deteksi dan rekonstruksi garis lurus Proses selanjutnya adalah deteksi dan rekonstruksi garis lurus. Deteksi
garis lurus dilakukan dengan pembandingan antara besar tiap-tiap R yang ada terhadap besar R maksimun yang telah dikalikan dengan nilai ambang yang telah ditentukan yaitu sebesar 0,75. Besarnya R maksimum yang telah dikalikan dengan nilai ambang dijadikan sebagai batas minimal besar R yang harus dipenuhi sebagai syarat dideteksi dan direkonstruksi sebagai sebuah garis lurus. Perekonstruksian garis lurus pada program ini dilakukan pada tiap-tiap titik penumpukan yang telah dideteksi sebagai garis lurus. Perekonstruksian garis lurus pada program ini dimulai dengan penghitungan dan penentuan letak titik asal
terhadap titik tengah citra hasil pendeteksian tepi yang dijadikan sebagai titik referensi. Titik tengah citra adalah suatu titik yang berada persis di tengah matriks suatu citra. Penentuan letak titik asal terhadap titik tengah citra yang dijadikan sebagai titik referensi dijadikan sebagai alat bantu untuk mempermudah proses perekonstruksian selanjutnya. Setelah itu ditentukan batas titik x sesuai batas kolom matriks pada citra asli. Selanjutnya dihitung dan ditentukan batas titik y dengan mengacu pada letak titik asal dan batas titik x. Setelah itu direkonstruksi garis lurus dan titik asalnya sesuai dengan batas titik x dan batas titik y yang bersesuaian yang telah dihitung sebelumnya.
3.
Hasil Implementasi
Berdasarkan implementasi algoritma dan kode program di atas diperoleh hasil pengolahan citra deteksi tepi menggunakan Hough Transform sebagai berikut. 1.
Citra asli Citra asli merupakan citra digital yang menjadi source image yang akan
dilakukan perekonstruksian garis lurus. Untuk memuat citra asli pada program yang dibuat dengan menggunakan OpenCV dengan cara menggunakan perintah sebagi berikut. /* load the image */ IplImage* img = cvLoadImage("./segitiga.jpg"); bmp Kode program 4. Perintah Untuk Memuat Citra
//jpg –
Gambar 11. Citra Asli
2.
Konversi Grayscale Konversi citra asli ke grayscale bertujuan agar citra tersebut memiliki
format yang dapat dibaca dan nantinya dapat diolah oleh komputer. Perintah yang digunakan oleh OpenCV untuk mengkonversi citra asli ke dalam grayscale adalah sebagai berikut. /* convert to grayscale */ cvCvtColor( img, img1, CV_RGB2GRAY); Kode program 5. Perintah Untuk Konversi Grayscale
Gambar 12. Citra Hasil Konversi Grayscale
3.
Deteksi Canny Edge Deteksi Canny Edge berfungsi untuk mendeteksi dan meningkatkan
kualitas tepi pada suatu citra. Perintah yang digunakan untuk konversi ke canny edge adalah sebagai berikut. /* canny edge detection */ cvCanny( img1, img2, 0, 5, 3 ); Kode program 6. Perintah Untuk Deteksi Canny Edge
Gambar 13. Citra Hasil Deteksi Canny Edge
4.
Standard Hough Transform Standard Hough Transform (SHT) menggunakan parameter normal untuk
garis lurus berupa persamaan, dengan sebagai jarak suatu garis terhadap titik asal dan sebagai orientasi garis tersebut terhadap sumbu. Setiap titik pada citra ditransformasikan menjadi suatu kurva sinusiodal pada ruang. Akumulator mencatat semua perpotongan kurva dan mengambil perpotongan terbanyak. Perintah yang digunakan untuk membuat operasi SHT pada citra adalah sebagai berikut. /* Standar Hough Transform Line */ CvSeq* houghLinesSHT = cvHoughLines2( img2, storage, CV_HOUGH_STANDARD, 1, CV_PI/180, 100, 0, 0 ); Kode program 7. Operasi Standard Hough Transform, dengan akumulator yang harus dicapai 100
Pada kode program 7 transformasi Hough SHT menggunakan nilai 100 sebagai parameter akumulator yang harus dicapai untuk menghasilkan garis. Hasil dari kode program 7 terlihat pada gambar 14.
Gambar 14. Citra Hasil Standard Hough Transform dengan nilai akumulator 100
Untuk memperoleh hasil yang lebih baik dapat dilakukan dengan melakukan variasi pada beberapa nilai parameter. Pada kode program 8 berikut terdapat variasi untuk nilai akumulator, yaitu sebesar 3. CvSeq* houghLinesSHT = cvHoughLines2( img2, storage, CV_HOUGH_STANDARD, 1, CV_PI/180, 3, 0, 0 ); Kode program 8. Operasi Standard Hough Transform, dengan akumulator yang harus dicapai 3
Hasil dari kode program 8, dapat terlihat seperti pada gambar 15 di bawah ini.
Gambar 15. Citra Hasil Standard Hough Transform dengan nilai akumulator 3
5.
Progressive Probabilistic Hough Transform Line Progressive Probabilistic Hough Transform Line (PPHT) merupakan
suatu implementasi yang lebih efesien dalam deteksi garis. Cara ini memberikan output yang lebih detail dalam mendeteksi sebuah garis pada suatu citra. Operasi PPHT dapat dilakukan dengan perintah sebagai berikut. /* Progressive Probabilistic Hough Transform Line */ CvSeq* houghLinesPPHT = cvHoughLines2( img2, storage, CV_HOUGH_PROBABILISTIC, 1, CV_PI/180, 50, 50, 10 ); Kode program 9. Operasi Progressive Probabilistic Hough Transform Line
Pada kode program 9 transformasi Hough PPHT menggunakan parameter 50 untuk akumulator, 50 menentukan panjang minimum dari segmen garis yang akan dijadikan kembalian, dan 10 menentukan jarak antara segmen kesegarisan (collinear segment ) secara algortima bukan untuk mengganbungkannya menjadi
segmen tunggal yang lebih panjang. Hasil dari kode program 9 terlihat pada gambar 16.
Gambar 16. Citra Hasil Progressive Probabilistic Hough Transform Line dengan nilai akumulator 50, panjang minimum segmen 50, dan collinear segment 10
Untuk memperoleh hasil yang lebih baik dapat dilakukan dengan melakukan variasi pada beberapa nilai parameter. Pada kode program 10 berikut terdapat variasi, yaitu: akumulator sebesar 16, panjang minimum segmen 10, dan jarak antar segmen (collinear segment ) 5. CvSeq* houghLinesPPHT = cvHoughLines2( img2, storage, CV_HOUGH_PROBABILISTIC, 1, CV_PI/180, 16, 10, 5 ); Kode program 10. Operasi Progressive Probabilistic Hough Transform Line
Hasil dari kode program 10 diatas, dapat terlihat seperti pada gambar 17 di bawah ini.
Gambar 17. Citra Hasil Progressive Probabilistic Hough Transform Line dengan nilai akumulator
16, panjang minimum segmen 10, dan collinear segment 5
REFERENSI
Adrian, Kaebler & Gary Bardski. “Learning OpenCV”. 2008. Cambridge: O’Reilly. OpenCV 2.4.9.0 documentation , http://docs.opencv.org/doc/tutorials/ imgproc/ imgtrans/hough_lines/hough_lines.html#hough-lines. Halimatus Sa’diyah, R.Rizal Isnanto, dan Achmad Hidayatno, “ APLIKASI TRANSFORMASI HOUGH UNTUK DETEKSI GARIS LURUS ”, Teknik Elektro, UNDIP, 2008. http://id.scribd.com/doc/43121235/Pendeteksian-Garis-Dengan-MemanfaatkanTransformasi-Hough. http://kacapembesar.wordpress.com/2009/12/05/canny-edge-detection/. https://id.scribd.com/doc/43121235/Pendeteksian-Garis-Dengan-MemanfaatkanTransformasi-Hough.