Deteksi objek mengacu pada kemampuan komputer dalam mendeteksi dan menentukan lokasi suatu objek pada citra digital. Deteksi objek banyak digunakan pada software – software berbasis computer vision. Memiliki banyak kegunaan diantaranya; deteksi wajah, deteksi manusia, mobil otomatis dan keamanan. Ada banyak metode untuk deteksi objek, bisa menggunakan segmentasi gambar sederhana, atau menggunakan kecerdasan buatan.
Daftar isi
Apa itu Thresholding?
Thresholding dalam bahasa Indonesia berarti pengambangan. Thresholding adalah algoritma segmentasi computer vision paling sederhana yang digunakan untuk memisahkan antara foreground (latar depan) objek utama yang ingin kita ambil dan background(latar belakang) yang ingin kita buang.
Proses thresholding membutuhkan input berupa gambar dengan nilai 1(255) dan 0(0), untuk itu kita harus mengubah gambar grayscale ke gambar binary atau kita sebut dengan proses binarization.
Proses thresholding paling sederhana adalah dengan mengambil sebuah nilai threshold T yang akan kita sebut dengan batas dan semua piksel yang bernilai kurang dari T akan kita ubah menjadi bernilai 0. Sebagai contoh kita memiliki tabel dibawah yang menunjukkan piksel pada sebuah gambar sederhana.
20 | 30 | 200 | 150 |
210 | 10 | 5 | 0 |
250 | 201 | 31 | 40 |
50 | 100 | 125 | 211 |
Kita akan memberikan nilai T = 200. Maka setelah proses binarization, tabel diatas akan berubah menjadi seperti berikut ini:
0 | 0 | 255 | 0 |
255 | 0 | 0 | 0 |
255 | 255 | 0 | 0 |
0 | 0 | 0 | 255 |
Ingat bahwa setiap piksel yang berada di bawah nilai T akan dikonversi ke 0 dan yang berada di atas nilai T akan dikonversi ke 255.
Melakukan deteksi Objek dengan Thresholding – OpenCV
Sekarang kita akan membuat deteksi objek sederhana dengan thresholding. Studi kasus yang akan kita buat adalah mendeteksi rambu lalu lintas pada gambar. Nantinya kita akan membuat sebuah script sederhana untuk mendemonstrasikan bagaimana threshold bekerja untuk mendeteksi objek dengan menggunakna python dan opencv seperti video berikut ini.
Baca Juga – Tutorial Deteksi Lingkaran Pada Gambar dengan Python
Menyiapkan Gambar
Aku akan menggunakan gambar berikut ini yang diambil dari pixabay.
Silahkan gunakan gambar yang sama atau bereskperimen dengan gambar lainya!
Buat direktori baru
Buat sebuah direktori baru, disini aku akan menamakanya dengan simple-object-detection. Buat dokumen baru bernama app.py dan letakkan gambar di folder tersebut.
Load Modul OpenCV
Jika kamu belum mempunyai OpenCV terinstal, kamu bisa menggunakan command
pip install opencv-python
Lalu pada file app.py masukkan
import cv2
Define Constant dan Load Gambar
Beri nama gambar dengan traffic-sign.jpg lalu tulis script berikut:
# CONSTANT # batas threshold = 0 # nama window windowName = 'image' # load gambar img = cv2.imread('traffic-sign.jpg')
Line 3 adalah batas threshold sebagaimana yang telah dijelaskan disini
Line 7 adalah nama window dimana kita akan meletakkan gambar dan slider
Line 10 adalah variable yang kita gunakan untuk membaca dan menyimpan gambar
Fungsi untuk menghandle slider
Pada gambar ini terdapat sebuah slider untuk mengatur nilai threshold. Disini kita perlu menulis fungsi untuk menghandle perubahan pada slider.
# ketika nilai slider diubah def on_change(threshold): pass # sementara kita akan melakukan pass terhadap perubahan threshold
Menampilkan Gambar
Selanjutnya kita akan menampilkan gambar dan menampilkan slider yang mengatur nilai threshold.
# tampilkan gambar pertama cv2.imshow(windowName, img) # buat trackbar cv2.createTrackbar('threshold', windowName, 0, 255, on_change) cv2.waitKey(0) cv2.destroyAllWindows()
Line 18 dengan menggunakan fungsi imshow() kita akan menampilkan gambar yang pertama kali dimuat. imshow membutuhkan 2 parameter yaitu nama window dan array gambar
Line 20 kita membuat slider dengan fungsi createTrackbar(). createTrackbar membutuhkan 5 parameter yaitu nama trackbar, nama window, nilai terendah, nilai tertinggi, dan fungsi yang menghandle perubahan trackbar
Line 22 akan memastikan gambar akan ditampilkan sampai ada interaksi selanjutnya pada window
Line 23 akan menutup semua window bila ada interaksi terhadap gambar
Menulis Fungsi Menghandle Slider
Selanjutnya kita akan menulis fungsi yang menghandle Slider. yaitu fungsi on_change
# ketika nilai slider diubah def on_change(threshold): # buat salinan dari img imageCopy = img.copy() # ubah ruang warna ke grayscale gray = cv2.cvtColor(imageCopy, cv2.COLOR_BGR2GRAY) # beri filter gaussian blur blurred = cv2.GaussianBlur(gray, (7, 7), 0)
Line 17 – 20 copy gambar pertama lalu ubah color space nya menjadi hitam putih.
Line 23 beri filter gaussian blur untuk menghilangkan noise pada gambar
# lakukan thresholding pada gambar dengan threshold inverted (T, thresh) = cv2.threshold(blurred, threshold, 255, cv2.THRESH_BINARY_INV) # ambil semua kontur dari hasil thresholding contours, hierarchy = cv2.findContours( thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
Line 26 lakukan threshold pada gambar hitam putih. Variable thresh akan berisi array dengan nilai 0 dan 1. Masukkan variable threshold pada fungsi threshold sebagai nilai threshold.
Line 28 lalu ambil semua kontur yang terdeteksi oleh fungsi threshold.
# untuk setiap kontur pada kontur - kontur yang ditemukan for cnt in contours: # hitung area kontur area = cv2.contourArea(cnt) if area > 40000: cv2.drawContours(imageCopy, cnt, -1, (0, 255, 0), 3) # tampilkan imageCopy cv2.imshow(windowName, imageCopy)
Kita lakukan looping pada setiap kontur yang ditemukan. Hitung area setiap kontur dan pastikan area lebih dari 40000 untuk menghilangkan kontur kontur yang tidak bisa kita definisikan sebagai foreground.
Sampai sini kita telah menemukan traffic sign pada threshold dengan nilai +-76