Deteksi Objek dengan Algoritma Thresholding OpenCV

Mari kita ajarkan bagaimana komputer untuk melihat indahnya dunia!
Facebook
Twitter
LinkedIn

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.

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.

2030200150
2101050
2502013140
50100125211

Kita akan memberikan nilai T = 200. Maka setelah proses binarization, tabel diatas akan berubah menjadi seperti berikut ini:

002550
255000
25525500
000255

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

Download Sourcecode 🎉

Baca Juga:

Muhammad Fajar Estu
Muhammad Fajar Estu
Fajar adalah seorang fullstack programmer yang sekarang bekerja sebagai .NET programmer. Memiliki pengalaman selama 3+ tahun di bidang programming web, mobile, API hingga aplikasi computer vision. Sekarang Fajar menulis artikel tutorial dan berbagi seputar dunia perkuliahan IT.

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *