Bab 1 Pengantar Machine Vision - Bab 1 7 Pengantar Machine Visiondan FeatureDetection2

Bab 1 Pengantar Machine Vision Tujuan Instruksional Umum : 1. Mahasiswa mampu menjelaskan peranan dan konsep pemrograman Computer Vision

  dan Machine Vision Tujuan Instruksional Khusus : 1.

  Mahasiswa mampu menjelaskan fungsi dari Computer Vision dan Machine Vision 2. Mahasiswa dapat menyebutkan beberapa penerapan dari Machine Viion 3. Menjelaskan fungsi dari program OpenCV 4. Mahasiswa dapat menjelaskan penelitian di bidang Computer Vision 5. Mahasiswa dapat menginstal program OpenCV dan membuat program loading image.

1.1 Mengenal Machine Vision

  Kecerdasan Buatan / Artificial Intelligence (AI) merupakan bidang ilmu komputer yang sangat penting di era kini dan masa akan datang untuk mewujudkan sistem komputer yang cerdas. Bidang ini telah berkembang sangat pesat di 20 tahun terakhir seiring dengan kebutuhan perangkat cerdas pada industri dan rumah tangga. Salah satu bidang di AI yang mengakuisisi, mengolah, memahami dan untuk mengambil informasi/keputusan dikenal sebagai Computer Vision. Oleh karena itu, buku ini memaparkan berbagai pandangan modern dan hasil riset terkini di bidang Computer Vision yang perlu dikuasai oleh para akademisi, mahasiswa, pelajar dan bahkan praktisi.

  Okasha pada buku Philosophy of Science: A Very Short Introduction, menyatakan bahwa Manusia sebagai mahluk Tuhan paling sempurna memiliki keingintahuan yang tinggi serta daya rekayasa yang luar biasa, yang berujung pada munculnya pengetahuan dan disiplin ilmu. Pada jaman Nabi Muhammad dan para pengikut sesudah jamannyapun, sudah ada para pemikir yang mengembangkan ilmu pengetahuan dengan sangat dahsyat, sehingga Arab pernah menjadi pusat ilmu pengetahuan dunia di Abad pertengahan. Disiplin-disiplin yang saat ini dipelajari manusia saat ini terbagi menjadi 3 kelompok yaitu ilmu Sains (bersumber dari bahasa latin scientia yang berarti memiliki pengetahuan atau mengetahui), Ilmu Kesusastraan dan Seni serta kelompok ketiga seperti Metafisika, Filsafat dan Agama. Ketiga disiplin ilmu tersebut berkembang pesat seiring dengan aktifitas

penelitian dan pengungkapan gagasan dan ide baik melalui buku, jurnal maupun media.

  Kata “intelligence” berasal dari bahasa Latin “intelligo” yang berarti “saya paham”. Berarti dasar dari intelligence ialah kemampuan untuk memahami dan melakukan aksi. Sebenarnya, area Kecerdasan Buatan (Artificial Intelligence) atau disingkat dengan AI, bermula dari kemunculan komputer sekitar tahun 1940-an, meskipun sejarah perkembangannya dapat dilacak sejak zaman Mesir kuno. Pada masa ini, perhatian difokuskan pada kemampuan komputer dalam mengerjakan sesuatu yang dapat dilakukan oleh manusia. Dalam hal ini, komputer tersebut dapat meniru kemampuan kecerdasan dan

perilaku manusia. Salah satu cabang dari Kecerdasan buatan ialah Computer Vision.

  Menurut Forsyth dan Ponece, Computer Vision adalah:

Extracting descriptions of the world from pictures or sequences of pictures

Sedangkan Machine vision: Machine vision (MV) is the technology and methods used to provide imaging-based automatic inspection and analysis for such applications as automatic inspection, process control, and robot guidance in industry.

  Machine vision merupakan teknologi untuk inspeksi otomatis berbasiskan image, misalnya pada:

   Pengontrolan proses industri  Pendeteksi nomor plat kendaraan

   Wood quality inspection

   Final inspection of sub-assemblies

   Engine part inspection

   Label inspection on products

   Checking medical devices for defects

   3D model building (photogrammetry)  Robot Vision  Surveillance (monitor penyusup, analisa trafik jalan tol dan lainnya)  Interaksi manusia dan robot (Human Robot Interaction)

  Gambar di bawah menampilkan relasi antara computer vision dengan bidang riset lainnya :

Gambar 1.1 Hubungan Computer vision dengan bidang lainnya

  Pada penerapannya, computer vision menerapkan digital image processing untuk menerapkan algoritma komputer untuk pemrosesan image pada image digital. Menurut Forsyth dan Ponce, Computer Vision adalah mengekstrak deskripsi dunia dari gambar atau urutan gambar. Computer vision secara umum merupakan area yang menyertakan metode metode untuk mengambil, pemroses menganalisa dan memahami image untuk menghasilkan informasi numeric atau simbolik. Image processing merupakan proses mengubah image 2D menggunakna metode Edge detection, fourirer transform atau enhancement untuk memperoleh output image 2D yang diinginkan (misalnya smoothing gambar).

Gambar 1.2 Proses Image processing

  Setelah image diperoleh lalu diproses, Metode Machine Vision antara lain:  Stitching/Registration: Combining of adjacent 2D or 3D images.

   Filtering (e.g

Thresholding: Thresholding starts with setting or determining a gray value that will be

useful for the following steps. The value is then used to separate portions of the image, and sometimes to transform each portion of the image simply black and white based on whether it is below or above that grayscale value.

   Pixel counting: counts the number of light or dar

 o simplify and/or

change the representation of an image into something that is more meaningful and easier to analyze  ng object edges  Color Analysis: Identify parts, products and items using color, assess quality from color, and isolate features using color.

  

 nspecting an image for discrete blobs of connected

pixels (e.g. a black hole in a grey object) as image landmarks. These blobs frequently

represent optical targets for machining, robotic capture, or manufacturing failure.

cluding template matching. Finding, matching, and/or counting specific patterns. This may include location of an object that may be rotated, partially hidden by another object, or varying in size.

   reading Output yang umum dari Machine Vision ialah keputusan pass/fail. Penerapan terkini misalnya pada system industry HP dan Robot Vision, dimana robot dapat melihat menggunakan kamera dan unit pendukung berupa sensor dan controller berkecepatan tinggi.

  Statistical process control has been around for many years and the benefits for adopting these methodologies are well documented throughout quality circles. Statistical process control does not require 100% inspection and for most industries process variation can be reduced if not completely eliminated when the appropriate sampling plans and inspection procedures are put into place.

Gambar 1.3 Proses Machine Vision pada Pabrik

1.2 Robot Vision

  Robot vision menerapkan Machine Vision. Ada beberapa istilah penting di dalam robot vision yang saling berhubungan, diantaranya computer vision, machine vision dan robot vision. Computer vision merupakan teknologi paling penting di masa yang akan datang dalam pengembangan robot yang interaktif. Computer Vision merupakan bidang pengetahuan yang berfokus pada bidang sistem kecerdasan buatan dan berhubungan dengan akuisisi dan pemrosesan image. Machine vision merupakan proses menerpakan teknologi untuk inspeksi automatis berbasis image, kontrol proses dan pemanduan robot pada berbagai aplikasi industri dan rumah tangga. Robot vision merupakan pengetahuan mengenai penerapan computer vision pada robot. Robot membutuhkan informasi vision untuk memutuskan aksi apa yang akan dilakukan.

  Penerapan saat ini vision pada robot antara lain sebagai alat bantu navigasi robot, mencari obyek yang diinginkan, inspeksi lingkungan dan lainnya. Vision pada robot menjadi sangat penting karena informasi yang diterima lebih detail dibanding hanya sensor jarak atau sensor lainnya. Misalnya dengan vision, robot dapat mengenal apakah obyek yang terdeteksi merupakan wajah orang atau bukan. Lebih jauh lagi, sistem vision yang canggih pada robot membuat robot dapat membedakan wajah A dengan wajah B secara akurat (Face recognition system menggunakan metode PCA, LDA dan lainnya). Proses pengolahan dari input image dari kamera hingga memiliki arti bagi robot dikenal sebagai visual perception , dimulai dari akuisisi image, image preprocessing untuk memperoleh image yang diinginkan dan bebas noise misalnya, ekstrasi fitur hingga interpretasi..

  Misalnya saja untuk identifikasi pelanggan dan penghindaran multiple moving obstacles berbasis vision, atau untuk menggerakan servo sebagai aktuator untuk mengarahkan kamera agar tetap mengarah ke wajah seseraong (face tracking).

1.3 Program OpenCV

  OpenCV ialah program open source berbasiskan C++ yang saat ini banyak digunakan sebagai program computer vision, salah satu penerapannya ialah pada robotika. Dengan OpenCV, Anda dapat membuat interaksi antara manusia dan robot (Human Robot Interaction. Misalnya, wajah dari manusia dideteksioleh camera/webcam, lalu diproses oleh komputer, untuk kemudian diproses oleh robot untuk melakukan aksi tertentu, misalnya mengikuti/mengenal wajah orang tersebut. Kesemuanya itu membutuhkan OpenCV sebagai program utama antara webcam dan pengolahnya yaitu komputer. Silahkan kunjungi situs opencv.org untuk download atau mengetahui berita terbaru tentang software ini. Program OpenCV 2.4.11 merupakan edisi terbaru yang harus Anda gunakan, program ini penting untuk dapat melakukan tugas 3D pada Machine Vision

Gambar 1.4 Beberapa task 3D [1]

1.3.1 Pemrograman Dasar OpenCV

  Anda membutuhkan editor dan kompiler Visual C++ 2012/ Visual Studio 2012 Express Edition untuk mengedit dan kompilasi program OpenCV. Anda terlebih dahulu harus mengkonfigurasi Visual C++ .Net tersebut dimana file library dan sourcenya harus disertakan. Beberapa file library juga harus ditambahkan pada input linker di Visual C++.

1. Jalankan program dan install pada suatu direktori, misalnya f:/OpenCV248 atau f:/OpenCV248 jika menggunakan versi OpenCV 2.4.9.

Gambar 1.5 Proses instalasi pada satu direktori 2.

  Tambahkan path ke Path Variable: f:\OpenCV246\opencv\build\x86\vc10\bin f:\OpenCV246\opencv\build\common\tbb\ia32\vc10

  3. Lalu, buat proyek baru untuk OpenCV menggunakan Visual C++ 2012, dengan memilih create a new Win32 console Application. Klik kanan Project dan pilh properties

Gambar 1.6 Memilih properties

  Pada bagian kiri, pilih C/C++ lalu edit Additional Include Directories dengan menambahkan :

  f:\OpenCV246\opencv\build\include\opencv f:\OpenCV246\opencv\build\include

4. PIlih linker dan tambahkan direktori ke Additional Library Directories:

  f:\OpenCV246\opencv\build\x86\vc10\lib

Gambar 1.7 Menambahkan Additional library Directories 5.

  Buka Linker dan pilih input, tambahkan Additional Dependencies berikut: opencv_core246d.lib opencv_imgproc246d.lib opencv_highgui246d.lib opencv_ml246d.lib opencv_video246d.lib opencv_features2d246d.lib opencv_calib3d246d.lib opencv_objdetect246d.lib opencv_contrib246d.lib opencv_legacy246d.lib opencv_flann246d.lib

Gambar 1.8 Menambahkan dependencies

  Jika sudah selesai, sebagai contoh buatlah program Win32 console application untuk menampilkan sebuah gambar di Windows, berikut contohnya:

  Displayimage.cpp:

  // Menampilkan Image menggunakan cvLoadImage //Dibuat oleh Widodo Budiharto #include "stdafx.h" #include <cv.h> #include <cxcore.h> #include <highgui.h> int _tmain(int argc, _TCHAR* argv[]){ // meload image IplImage *img = cvLoadImage("f:\handsome.jpg"); cvNamedWindow("OpenCV",1); cvShowImage("OpenCV",img);

  //tunggu sembarang input dari user untuk exit cvWaitKey(0); cvDestroyWindow("OpenCV "); cvReleaseImage(&img); return 0; }

  Pada program di atas, dibutuhkan library seperti cv.h, sxcore.h dan highgui.h agar fungsi dikenal oleh compiler. Hasil dari program di atas ialah :

Gambar 1.9 Hasil program menampilkan image

  Jika Anda menginginkan pemrograman dengan style 2.x C++, berikut contohnya

menggunakan cv::Mat. Cv::Mat muncul di OpenCV versi terkini yang secara mendasar ialah

sebuah class dengan 2 bagian data, yaitu header matrik (berisi informasi ukuran matrik, metode

yang digunakan untuk menyimpan) dan sebuah pointer ke matrik berisi nilai pixel, berikut

contohnya:

  cv::Mat A, C; // membuat bagian header A = imread(argv[1], CV_LOAD_IMAGE_COLOR); // alokasi matrik cv::Mat B(A); // menggunakan kopi constructor C = A; // operator assignment

  

Pada program di atas, kita meload image menggunakan fungsi imread(). Berikut contoh

program untuk loading image berbasis C++: DisplayImage2.cpp: #include "stdafx.h" // Program demo C++ untuk display image.

  #include <stdlib.h> #include <cv.hpp> #include <cxcore.hpp> #include <highgui.h> int _tmain(int argc, _TCHAR* argv[]){ cv::Mat img = cv::imread("f:\handsome.jpg"); cv::imshow("OpenCV",img);

  //tunggu sembarang input dari user untuk exit cv::waitKey(); return EXIT_SUCCESS; }

1.4 Digital Image Processing

  Sebuah image ialah sebuah array, atau matrik dari piksel persegi yang disusun dalam format kolom dan baris. Pada image greyscale (8bit), tiap elemen gambar memiliki intesitas antara 0-255, sedangkan image true color terdiri dari 24 bit( 8x8x8 =16 juta warna) seperti gambar di bawah :

  (a) (b)

Gambar 1.10 Image greyscale 8 bit (a), dan image true color yang tersusun dari 3 greyscale image berwarna merah, hijau dan biru yang dapat berisi hingga 16 juta warna berbeda (b).

  Image standar dikenal sebagai image RGB (terdiri dari komponen Merah, Hijau dan biru) dan memiliki sistem warna 24 bit yang masing masing terdiri dari 8 bit. Representasi warna bertipe integer bervariasi dari 0-255, sedangkan untuk tipe float berkisar antara 0-1. Nilai warna tersebut disimpan pada matrik 3 dimensi yang dilambangkan dalam Intensitas I (X,Y, channel). Nilai warna RGB dapat dinormalisasi menggunakan persamaan : � � =

  � �+�+� � � =

  � �+�+� � � =

  � �+�+�

  (1.1) Sedangkan proses grascale menggunakan persamaan

  ���� = �+�+� �

  (1.2)

  Kadang citra yang kita miliki perlu kita olah untuk tujuan tertentu yang dikenal dengan istilah Pengolahan Citra, misalnya proses penjumlahan nilai RGB pada images. Awal mula pemrosesan image digital dimulai pada sekitar tahun 1960an pada satelit, medical imaging dan character recognition.

  Pemrosesan image digital memungkinkan penggunaan algoritma komplek untuk pemrosesan image sehingga menghasilkan performa sistem yang robust dan berbiaya murah. Klasifikasi merupakan metode yang sangat penting dalam image processing. Pemrosesan image digital umumnya digunakan pada proses :

    

  Beberapa teknik yang digunakan pada pemrosesan image digital antara lain :   Erosi dan dilasi     

  

Pada pengolahan citra dasar, biasanya edge detection, threshold dan countour sangat

dibutuhkan, berikut contohnya : Countour.cpp:

  //Program membuat countour dan variasi threshold #include <cv.h> #include <highgui.h> IplImage* image = 0; int thresh = 100; void on_trackbar(int) { IplImage* gray = cvCreateImage( cvGetSize(image), 8, 1 ); CvMemStorage* storage = cvCreateMemStorage(0); CvSeq* contours = 0; cvCvtColor( image, gray, CV_BGR2GRAY ); cvThreshold( gray, gray, thresh, 255, CV_THRESH_BINARY ); cvFindContours( gray, storage, &contours ); cvZero( gray ); if( contours ) cvDrawContours( gray, contours, cvScalarAll(255), cvScalarAll(255), 100 ); cvShowImage( "Contours", gray );cvReleaseImage( &gray ); cvReleaseMemStorage( &storage ); } int main( int argc, char** argv ) { IplImage* image; if( argc != 2 || !(image = cvLoadImage(argv[1])) ) return -1; cvNamedWindow( "Contours", 1 ); cvCreateTrackbar( "Threshold", "Contours", &thresh, 255, on_trackbar ); on_trackbar(0); cvWaitKey(); return 0;

  }

Gambar 1.11 Program countour pada Lena.jpg

  Pada pengolahan citra, untuk mengambil sebagian daerah penting dari suatu image, biasa dikenal sebagai ROI (region of interest), dapat digunakan fungsi berikut :

  cvSetImageROI(src, cvRect(x,y,width,height));

  Berikut ini contoh program ROI:

  ROI.cpp:

  #include "stdafx.h" #include <cv.h> #include <highgui.h> int main(int argc, char** argv) { IplImage* src; cvNamedWindow("Contoh awal", CV_WINDOW_AUTOSIZE); cvNamedWindow("Contoh akhir", CV_WINDOW_AUTOSIZE); if( argc == 7 && ((src=cvLoadImage(argv[1],1)) != 0 )) { int x = atoi(argv[2]); int y = atoi(argv[3]); int width = atoi(argv[4]); int height = atoi(argv[5]); int add = atoi(argv[6]); cvShowImage( "Contoh awal", src); cvSetImageROI(src, cvRect(x,y,width,height)); cvAddS(src, cvScalar(add),src); cvResetImageROI(src); cvShowImage( "Contoh akhir",src); cvWaitKey();

  } cvReleaseImage( &src ); cvDestroyWindow("Contoh awal"); cvDestroyWindow("Contoh akhir"); return 0; }

Gambar 1.12 Area ROI pada image

1.5 Penelitian di Bidang Machine dan Computer Vision

  Penelitian di bidang Machine dan Computer Vision biasanya dimulai dengan adanya masalah yang ada dan teridentifiaksi di sekitar kita atau di bidang kerja kita, diikuti dengan tujuan yang ingin dicapai dari penyelesaian masalah tersebut. Pertanyaan penelitian kemudian dapat diajukan untuk memfokuskan permasalahan yang ada. Dengan didukung literatur yang diperoleh sebelumnya, kita dapat mengonstruksikan hipotesis. Hipotesis atau hipotesa adalah jawaban sementara terhadap masalah yang masih bersifat praduga karena masih harus dibuktikan kebenarannya. Desain dan metode penelitian pada bidang computer vision harus dipilih yang sesuai agar dapat dilaksanakan dengan optimal, misalnya menggunakan metode penelitian kuantitatif karena jumlah sampel yang banyak dan menggunakan pengamatan/observasi dan survei.

  Identifikasi masalah dan tujuan Mengajukan sebuah pertanyaan penelitian

  Mereview literatur sebelumnya Mengonstruksikan hipotesis

  Memilih desain dan metode penelitian Menguji hipotesis

  Membuat kesimpulan

Gambar 1.13 Langkah-langkah dalam penelitian

  Hasil hipotesis dapat digunakan untuk mengambil kesimpulan dari penelitian yang telah dilaksanakan. Kesimpulan yang diambil menyimpulkan apakah hasil penelitian yang dilakukan dapat membuktikan hipotesis yang ada. Ketika informasi yang dikumpulkan melalui tes, peneliti mencoba untuk memastikan bahwa tes tersebut :

   Valid: apakah instrumen pengukurannya mampu mengukur apa yang seharusnya diukur sesuai dengan tujuan penelitan.  Reliable: Menyediakan hasil yang konsisten bila diberikan pada kesempatan yang berbeda.

  Latihan : 1.

  Jelaskan definisi dari Machine Vision

  2. Berikan penjelasan mengenai system inspeksi industry seperti pengukuran dimensi

Gambar 1.14 Inspeksi industri 3.

  Jelaskan peranan Computer Vision dan Machine Vision pada bidang Industri dan pendidikan 4. Buatah program untuk menampilkan image dan jelaskan tiap fungsi dari kode yang digunakan.

  5. Jelaskan beberapa metode di Machine Vision 6.

  Sebutkan beberapa topic penelitian menarik di bidang Machine Vsiion Vision

  Referensi: th 1.

  edition, Cengage Milan Sonka et al(2015), Image Processing, Analysis, and Machine Vision, 4 Learning, USA.

  2. Forsyth, D., Ponce, J. (2012). Computer Vision: A Modern Approach. 2nd ed. Prentice Hall. ISBN: 978-0-27-376414-4 3. Opencv.org 4.

  Walliman, N. (2011) Research Methods: The Basics. London: Roudlege 5. Okasha, S. (2002) Philosophy of Science: A Very Short Introduction. Oxford: Oxford University Press.

  6. Stuart Russel and Peter Norvig, (2011), Artificial Intelligence, A Modern Approach, Pearson Publisher.

  7. Widodo Budiharto (2015), Robot Modern, Andi Offset Publisher- Yogyakarta.

Bab 7 Feature Detection 2 Tujuan Instruksional Umum : 1. Mahasiswa mampu menjelaskan peranan dan konsep Segmentation, thresholding dan boundary serta descriptor. Tujuan Instruksional Khusus : 1. Mahasiswa mampu menjelaskan fungsi thresholding dan segmentation 2. Mahasiswa dapat menjelaskan megnenai fourier descriptor dan region descriptor 3. Mahasiswa dapat membuat program segmentasi

7.1 Pendahuluan

  Computer Vision adalah ilmu pengetahuan dan teknologi dari suatu sistem komputer mampu memiliki kemampuan akuisisi, memroses dan memahami (understanding) dari suatu image/streaming video. Sehingga apabila dirumuskan, Computer Vision adalah:

  Computer Vision = Camera + Computer + Pattern Recognition

  Untuk representasi pada komputer, fungsi (misalnya intensitas) harus disampling pada interval diskrit. Sampling adalah memetakan nilai intensitas ke interval diskrit. Titik-titik dimana image disampling disebut element gambar atau piksel. Sedangkan resolusi menentukan jarak diantara titik-titik. Pada spatial digitization(sampling) persamannya adalah:

  

I(x,y) =f(x,y).s(x,y) (7.1) Dimana s(x,y) =1 untuk setiap nilai dari x dan y Metode point prosessing adalah yang paling primitive dimana piksel lama dikonversi ke piksel baru berdasarkan fungsi yang telah ditentukan. Pada pengolahan citra dasar, biasanya edge detection, threshold dan countour sangat dibutuhkan. Konsepnya dapat

menggunakan triangle algorithm untuk mencari nilai threshold seperti gambar di bawah:

Gambar 7.1 Triangle algorithm

  Untuk mengubah image warna ke grayscale digunakan persamaan beriut grayscale image = ( (0.3 * R) + (0.59 * G) + (0.11 * B) ).

  Tujuan dari image processing adalah : 1. Visualization – observasi obyek yang tidak terlihat.

  2. Image sharpening and restoration – untuk membuat image yang lebih bagus terlihat 3. Image retrieval - menjcari image of interest.

  4. Measurement of pattern – mengukur berbagai obyek pada image

  5. Image Recognition – membedakan antara obyek di image

Gambar 7.2 color image (a) and grayscale image (b)

7.2 Threshoding

  Thresholding merupakan method segmenetasi yang paling mudah, sebagai contoh memisahkan area image suatu obyek dengan area lainnya dengan cara variasi intensitas (dengan membuat image orisinal menjadi gray) diantara piksel obyek tersebut dengan piksel background dengan nilai ambang(threshold) tertentu. Thresholding merupakan proses dasar segmentasi. Segmentasi merupakan salah satu tugas tersulit dalam pemrosesan image. Akurasi segmentasi ditentukan oleh sukses atau gagalnya prosedur analisis otomatis. Aksi Segmentasi terdiri dari membagi image ke region atau obyek yang sesuai. Tujuan dari segmentasi image untuk dekomposisi image ke bagian yang berarti.

Gambar 7.3 Inspeksi PCB otomatis

  Segmentasi image secara umum berdasarkan property nilai intensitas: 1. Discontinuity: partisi image berdasarkan abrupt changes pada intensitas seperti edges 2. Similarity: partisi image ke regiton yang mirip sesuai pada criteria yang ditentukan.

  Thresholding merupakan pendekatan dasar dari segmentasi. Single value thresholding secara matematis adalah: 1 if f ( x , y ) T

   

  g ( x , y ) 

  

  if f ( x , y ) T

   

  Proses melakukan thresholding pada OpenCV menggunakan fungsi threshold. Berikut contohnya : Threshold.cpp:

  //Thresholding Demo #include "opencv2/imgproc/imgproc.hpp" #include "opencv2/highgui/highgui.hpp" #include <stdlib.h>

  #include <stdio.h> using namespace cv; /// Global variables int threshold_value = 0; int threshold_type = 3;; int const max_value = 255; int const max_type = 4; int const max_BINARY_value = 255; Mat src, src_gray, dst; char* window_name = "Threshold Demo";

char* trackbar_type = "Type: \n 0: Binary \n 1: Binary Inverted \n 2: Truncate \n 3: To Zero \n 4: To Zero

Inverted"; char* trackbar_value = "Value"; /// Function headers void Threshold_Demo( int, void* ); int main( int argc, char** argv ){ /// Load image src = imread( argv[1], 1 ); /// Ubah image ke gray cvtColor( src, src_gray, CV_RGB2GRAY ); /// buat window namedWindow( window_name, CV_WINDOW_AUTOSIZE ); /// Buat Trackbar createTrackbar( trackbar_type, window_name, &threshold_type, max_type, Threshold_Demo ); createTrackbar( trackbar_value, window_name, &threshold_value, max_value, Threshold_Demo ); Threshold_Demo( 0, 0 ); while(true) { int c; c = waitKey( 20 ); if( (char)c == 27 ) { break; }

  } } void Threshold_Demo( int, void* ){ /* 0: Binary 1: Binary Inverted 2: Threshold Truncated 3: Threshold to Zero 4: Threshold to Zero Inverted

  • / threshold( src_gray, dst, threshold_value, max_BINARY_value,threshold_type ); imshow( window_name, dst ); }

Gambar 7.4 Program Threshold pada Lena.jpg

  Partisi image histogram menggunakan single global threshold. Basic global threshold, T, dihitung menggunakan algoritma:

1. Select an initial estimate for T (typically the average grey level in the image)

  2.

  1 consisting of pixels with grey

  Segment the image using T to produce two groups of pixels: G levels >T and G

  2 consisting pixels with grey levels ≤ T 3.

  1 to give μ 1 and G 2 to give μ

  2 Compute the average grey levels of pixels in G 4.

  Compute a new threshold value:

    

  1

2 T 

  2 5.

  Repeat steps 2 – 4 until the difference in T in successive iterations is less than a predefined limit T

  ∞

Gambar 7.5 Hasil thresholding

  Menggunakan global threshold mungkin bukan pilihan bagus dimana image memili

pencahayaan berbeda pada beda tempat, sehingga dibutuhkan adaptive thresholding, pada Phyton:

cv.AdaptiveThreshold(src, dst, maxValue, adaptive_method=CV_ADAPTIVE_THRESH_ adaptiveThreshold.py: import cv2 import numpy as np from matplotlib import pyplot as plt img = cv2.imread('bw.png',0) img = cv2.medianBlur(img,5) ret,th1 = cv2. threshold (img,127,255,cv2.THRESH_BINARY) th2 = cv2. adaptiveThreshold (img,255,cv2.ADAPTIVE_THRESH_MEAN_C,\ cv2.THRESH_BINARY,11,2) th3 = cv2. adaptiveThreshold (img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,\ cv2.THRESH_BINARY,11,2) titles = ['Original Image', 'Global Thresholding (v = 127)', 'Adaptive Mean Thresholding', 'Adaptive Gaussian Thresholding'] images = [img, th1, th2, th3] for i in xrange(4): plt.subplot(2,2,i+1),plt.imshow(images[i],'gray') plt.title(titles[i]) plt.xticks([]),plt.yticks([]) plt.show()

Gambar 7.6 global threshold

7.3 Histogram Equalization

  Histogram equalization merupakan representasi grafis dari distribusi intensitas dari image, yang

  mengkuantifikasi jumlah piksel untuk tiap intensitas. Histogam equalization merupakan representasi grafis dari distribusi intensitas image, perhatikan gambar di bawah dimana idealnya intensitas pixel menyebar.

Gambar 7.7 Histogram equalization

  Berikut kode demo Histogram Equalization yang dapat digunakan pada pendeteksi objek di system robotika [4]: Histogram.cpp:

  //Demo Histogram Eequalization #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include <iostream> #include <stdio.h> using namespace cv; using namespace std; int main( int argc, char** argv ){ Mat src, dst; char* source_window = "Source image"; char* equalized_window = "Equalized Image"; /// Load image src = imread( argv[1], 1 ); if( !src.data ) { cout<<"Usage: ./Histogram_Demo <path_to_image>"<<endl; return -1;} /// konversi ke grayscale cvtColor( src, src, CV_BGR2GRAY ); /// Apply Histogram Equalization equalizeHist( src, dst ); /// Menampilkan hasil namedWindow( source_window, CV_WINDOW_AUTOSIZE ); namedWindow( equalized_window, CV_WINDOW_AUTOSIZE ); imshow( source_window, src ); imshow( equalized_window, dst ); /// Wait until user exits the program waitKey(0); return 0; }

Gambar 7.8 Hasil Histogram equalization

7.5 Boundary

  OpenCV menggunakan marker-based watershed algorithm yang merupakan interactive image segmentation. Kita memberikan label yang berbeda untuk obyek yang kita kenal sehingga kita dapatkan boundary dengan nilai -1.

  Boundary.py: import numpy as np import cv2 from matplotlib import pyplot as plt img = cv2.imread('coins.png') gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

ret, thresh = cv2.threshold(gray,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)

Gambar 7.9 Hasil thresholding

  markers = cv2.watershed(img,markers) img[markers == -1] = [255,0,0] OpenCV memiliki sample watershed segmentation bernama watershed.py.

Gambar 7.10 Hasil labelling Kita dapat merepresentasikan contour dengan urutan koordinat pikel pada image.

  

Himpunan piklse pada batas dari suatu bentuk ditraslasi ke himpunan koneksi diantara mereka.

Gambar 7.11 Berbagai Konektifitas

7.6 Identifikasi Boundary

  Obyek dipresentasikan sebagai kumpulan pixel di image. Untuk mendukung pengenalan

obyek, dibutuhkan penjelasan property dari pixel grup  object descriptor. 2 bentuk object

descriptor: 1.

  Boundary descriptor: characterize an arrangement of pixels in the object perimeter or boundary

2. Region descriptor: characterize an arrangement of pixels within the area of the object

7.7 Descriptor

  Terdapat 2 region descriptor: 1. Basic: characterize the geometric properties of the region 2. Moment: characterize the density of the region

  Sebuah region dapat dijelaskan dengan memperhatikan pengukuran scalar berdasarkan

property geometris. Anggap x[m] dan y[m] koordinat m-th pixel pada boundary, bilangan

komplek z[m]=x[m]+jy[m], dan Fourier Descriptor (FD) dari bentuk didefinisikan sebagai DFT dari z[m]: Untuk extracting keypoints and computing descriptors menggunakan SIFT (Scale Invariant Feature Transform) algorithm oleh D. Lowe dapat membaca: Lowe, D. G., “Distinctive Image Features from Scale-Invariant Keypoints”, International Journal of Computer Vision, 60, 2, pp. 91-110, 2004.

7.8 Moments

  Moment menjelaskan layout bentuk. Perhitungan seluruh moment hingga order ke tiga dari sebuah polygon atau bentuk teraster:

  In case of a raster image, momen spasial dihitung: Momen pusat dhitung: Dimana adalah center massa: normalized central moments dihitung: Catatan: ,

  , hence the values are not stored. Fungsi menghitung 7 Hu invariants:

Gambar 7.12 Invariant moments Moments.cpp:

  #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include <iostream> #include <stdio.h> #include <stdlib.h> using namespace cv; using namespace std; Mat src; Mat src_gray; int thresh = 100; int max_thresh = 255; RNG rng(12345); /// Function header void thresh_callback(int, void* ); /** @function main */ int main( int argc, char** argv ) { /// Load source image and convert it to gray src = imread( argv[1], 1 ); /// Convert image to gray and blur it cvtColor( src, src_gray, CV_BGR2GRAY ); blur( src_gray, src_gray, Size(3,3) );

  /// Create Window char* source_window = "Source"; namedWindow( source_window, CV_WINDOW_AUTOSIZE ); imshow( source_window, src ); createTrackbar( " Canny thresh:", "Source", &thresh, max_thresh, thresh_callback ); thresh_callback( 0, 0 ); waitKey(0); return(0); } /** @function thresh_callback */ void thresh_callback(int, void* ) { Mat canny_output; vector<vector<Point> > contours; vector<Vec4i> hierarchy; /// Detect edges using canny Canny( src_gray, canny_output, thresh, thresh*2, 3 ); /// Find contours findContours( canny_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) ); /// Get the moments vector<Moments> mu(contours.size() ); for( int i = 0; i < contours.size(); i++ ) { mu[i] = moments( contours[i], false ); } /// Get the mass centers: vector<Point2f> mc( contours.size() ); for( int i = 0; i < contours.size(); i++ ) { mc[i] = Point2f( mu[i].m10/mu[i].m00 , mu[i].m01/mu[i].m00 ); } /// Draw contours Mat drawing = Mat::zeros( canny_output.size(), CV_8UC3 ); for( int i = 0; i< contours.size(); i++ ) { Scalar color = Scalar( rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255) );

drawContours( drawing, contours, i, color, 2, 8, hierarchy, 0, Point() ); circle( drawing, mc[i], 4, color, -1, 8, 0 ); } /// Show in a window namedWindow( "Contours", CV_WINDOW_AUTOSIZE ); imshow( "Contours", drawing ); /// Calculate the area with the moments 00 and compare with the result of the OpenCV function printf("\t Info: Area and Contour Length \n"); for( int i = 0; i< contours.size(); i++ ) { printf(" * Contour[%d] - Area (M_00) = %.2f - Area OpenCV: %.2f - Length: %.2f \n", i, mu[i].m00, contourArea(contours[i]), arcLength( contours[i], true ) ); Scalar color = Scalar( rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255) );

drawContours( drawing, contours, i, color, 2, 8, hierarchy, 0, Point()

); circle( drawing, mc[i], 4, color, -1, 8, 0 ); } }

  Pada Versi OpenCV 3.0

   #include <iostream> #include <stdio.h> #include <stdlib.h> src_gray; int thresh = 100; int max_thresh = 255; rng(12345); void thresh_callback(int, void* ); int main( int, char** argv ) { const char* source_window = "Source"; ); thresh_callback ); thresh_callback( 0, 0 ); return(0); } void thresh_callback(int, void* ) { canny_output; vector<vector<Point> > contours; vector<Vec4i> hierarchy; vector<Moments> mu(contours.size() ); for( size_t i = 0; i < contours.size(); i++ ) vector<Point2f> mc( contours.size() ); for( size_t i = 0; i < contours.size(); i++ )

  0/mu[i].m00) , static_cast<float>(mu[i].m01/mu[i].m00) ); } ); for( size_t i = 0; i< contours.size(); i++ ) { rng.uniform(0,255) ); ); -1, 8, 0 ); } ); printf("\t Info: Area and Contour Length \n"); for( size_t i = 0; i< contours.size(); i++ ) { printf(" * Contour[%d] - Area (M_00) = %.2f - Area OpenCV: %.2f - Length: %.2f \ contours[i], true ) ); rng.uniform(0,255) ); ); -1, 8, 0 ); } }

Gambar 7.13 Hasil moment

7.9 Embedded System untuk Machine Vision

  Pada saat ini, beberapa sistem embedded yang terkenal untuk dapat melakukan image

processing ialah Raspberry Pi yang dilengkapi dengan kamera parallel kecepatan tinggi dan

Odroid-XU berbasiskan quad prosesor, misalnya untuk tracking pada robot[5]. Gambar di bawah

ini menampilkan Raspberri Pi dan Odroid-XU.

  (a) (b)

Gambar 7.14 Raspberry Pi model B 512M dengan kamera parallel (a) dan Odroid-XU (b)

  Sistem embedded biasanya digunakan untuk aplikasi-aplikasi akuisisi data, pengontrol multifungsi dengan daya yang dibutuhkan minimal, misalnya :

  1. Pengontrolan robot berbasis vision 2.

  Transaksi dan display di jalan toll.

  3. Telemetri di tempat-tempat remote.

  4. Industri mainan anak-anak/games 5.

  Electronics smart devices di mall dan industry 6. Telepresence robot 7. Robot humanoid dan robot soccer Agar dapat bekerja dengan power yang rendah dan cepat, sistem embedded memiliki 2 komponen utama, yaitu:

  1. Hardware  Catu daya stabil bertegangan dan berarus rendah  Mikrorosesor ARM Cortex, Propeller, Intel dan lainnya

   Memori DRAM  Timer  Port HDMI

   Port USB  Port Audio stereo  Port I/O

  2. Software Sistem Embedded memiliki software yang ditulis dalam bahasa yang lebih dekat/dikenali

oleh hardware, misalnya C++ dan Java, dengan sistem Operasi seperti Linux Ubuntu jika

menggunakan Odroid dan Raspbian jika menggunakan Raspberry Pi.

  Latihan : 1.

  Jelaskan fungsi dari Histogram equalization 2. Buat program untuk mengambil obyek bola dari lingkungannya menggunakan thresholding, smoothing dan histogram equalization.

3. Jelaskan mengenai contour:

  The cv::findCountours function will detect contours on the input binary image: void MarkerDetector::findContours(const cv::Mat& thresholdImg, std::vector<std::vector<cv::Point> >& contours, int minContourPointsAllowed) { std::vector< std::vector<cv::Point> > allContours; cv::findContours(thresholdImg, allContours, CV_RETR_LIST, CV_ CHAIN_APPROX_NONE); contours.clear(); for (size_t i=0; i<allContours.size(); i++) { int contourSize = allContours[i].size(); if (contourSize > minContourPointsAllowed) { contours.push_back(allContours[i]); } }

  }

  Referensi: 1.

  Milan Sonka et al(2015), Image Processing, Analysis, and Machine Vision, 4

  th

  edition, Cengage Learning, USA.

  2. Forsyth, D., Ponce, J. (2012). Computer Vision: A Modern Approach. 2nd ed. Prentice Hall. ISBN: 978-0-27-376414-4 3. Opencv.org 4. Walliman, N. (2011) Research Methods: The Basics. London: Roudlege 5. Okasha, S. (2002) Philosophy of Science: A Very Short Introduction. Oxford: Oxford University Press.

  6. Stuart Russel and Peter Norvig, (2011), Artificial Intelligence, A Modern Approach, Pearson Publisher.

  7. Stuart Russel and Peter Norvig, (2011), Artificial Intelligence, A Modern Approach, Pearson Publisher.

  8. Widodo Budiharto (2015), Robot Modern, Andi Offset Publisher- Yogyakarta.

  9. Widodo Budiharto et al, Ball Distance Estimation and Tracking System of Humanoid

Soccer Robot, Lecturer Notes on Information Technology, Springer Publisher, 2014.