Tutorial Deteksi Objek Lingkaran Pada Gambar dengan Python

Facebook
Twitter
LinkedIn

Lingkaran dapat ditemukan di hampir seluruh sudut kehidupan manusia. Deteksi lingkaran pada gambar tentunya dapat dimanfaatkan untuk berbagai macam keperluan seperti deteksi rambu lalu lintas atau roda kendaraan.

Deteksi objek berbentuk lingkaran sudah menjadi permasalahan banyak pakar sains komputer. Ketika ditemukan sebuah algoritma bernama Hough Circle, deteksi lingkaran menjadi lebih mudah. Kamu tidak perlu memikirkan perhitungan rumit di dalam algoritma hough circle, dengan library OpenCV dan bahasa pemograman Python, deteksi lingkaran bukan lagi sesuatu yang sulit dengan menggunakan modul cv2.HoughCircles.

Pengenalan Algoritma Hough Circle

Algoritma hough circle adalah algoritma yang digunakan untuk mendeteksi lingkaran pada gambar. Algoritma ini dapat dengan baik mendeteksi lingkaran yang bahkan tidak sempurna. Jurnal penelitian yang dapat menjadi referensi dapat kamu temukan di jurnal Yuen dan kawan – kawan.

Deteksi Objek Lingkaran Pada Gambar dengan OpenCV

Algoritma Hough Circle di OpenCV dapat kamu lakukan dengan menggunakan fungsi cv2.HoughCircle. Penjelasan fungsi tersebut adalah sebagai berikut:

cv.HoughCircles(image, method, dp, minDist,
                               param1, param2,
                               minRadius, maxRadius)
  • image: Gambar yang digunakan harus 8-bit dan single channel. Jika kamu menggunakan gambar berwarna, pastikan untuk mengkonversi ke grayscale terlebih dahulu.
  • method: Metode yang digunakan untuk mendeteksi lingkaran. Saat ini metode yang tersedia adalah cv2.HOUGH_GRADIENT.
  • dp: Parameter ini adalah rasio terbalik dari akumulator resolusi pada gambar. Kamu bisa melihat penjelasan lebih lengkapnya pada jurnal Yuen dkk. Semakin besar dp, semakin kecil array akumulatornya.
  • minDist: minDist adalah jarak minimum antara koordinat titik tengah dari lingkaran yang terdeteksi.
  • param1: Nilai gradient yang digunakan untuk melakukan deteksi tepi.
  • param2: Nilai batas akumulator yang digunakan oleh cv2.HOUGH_GRADIENT.
  • minRadius: Radius minimal dari lingkaran dalam pixel.
  • maxRadius: Radius maksimal dari lingkaran dalam pixel.

Tutorial

Install OpenCV

Install OpenCV dan numpy dengan mengetik perintah:

pip install opencv-python
pip install numpy

Buat file baru

Buat file baru dengan nama app.py.

Pilih gambar

Aku menggunakan gambar rambu lalu lintas dari unsplash. Tugas kita adalah mendeteksi rambu lalu lintas “batas kecepatan 40”.

Unsplash

Simpan gambar diatas dan letakkan di tempat yang sama dengan app.py. beri nama traffic-sign.jpg

Load OpenCV dan numpy

import cv2 as cv
import numpy as np

Kita akan menggunakan openCV untuk melakukan deteksi lingkaran dan numpy untuk melakukan perhitungan matematis.

Load gambar

Load gambar dengan perintah cv.imread(). Gambar yang ada berukuran sangat besar. Oleh karena itu, untuk mengurangi proses komputasi dan mempercepat proses deteksi kita akan meresize gambar tersebut ke ukuran yang lebih kecil.

# Nama file
filename = 'traffic-sign.jpg'

# Load gambar traffic-sign.jpg
src = cv.imread(filename)
 
# resize ke 30% ukuran aslinya
scale_percent = 30 
width = int(src.shape[1] * scale_percent / 100)
height = int(src.shape[0] * scale_percent / 100)
dim = (width, height)
resized = cv.resize(src, dim, interpolation = cv.INTER_AREA)

Ubah ke GRAYSCALE

fungsi cv2.HoughCircle() hanya menerima gambar 8-bit dengan ruang warna hitam – putih / grayscale sedangkan perintah cv2.imread(). Untuk itu kita harus mengubahnya ke format grayscale dengan perintah cv2.cvtColor(img, cv.COLOR_BGR2GRAY). Lalu memberikan filter median blur untuk mengurangi noise pada gambar.

# ubah ke grayscale
gray = cv.cvtColor(resized, cv.COLOR_BGR2GRAY)

# beri filter median blur
gray = cv.medianBlur(gray, 5)

Hasil script diatas akan menghasilkan gambar seperti berikut ini:

Gambar diatas sudah siap untuk diproses dengan algoritma Hough Circle untuk mencari lingkaran di dalamnya.

Aplikasikan Hough Circle

Aplikasikan Hough Circle dengan script dibawah ini:

# aplikasikan hough circle
circles = cv.HoughCircles(gray, cv.HOUGH_GRADIENT, 0.5, 20,
                            param1=100, param2=30,
                            minRadius=10, maxRadius=70)

# Jika lingkaran ditemukan
if circles is not None:
    circles = np.uint16(np.around(circles))
    # Untuk setiap lingkaran, gambar lingkaran diatasnya
    for i in circles[0, :]:
        center = (i[0], i[1])
        # circle center
        cv.circle(resized, center, 1, (0, 100, 100), 3)
        # circle outline
        radius = i[2]
        cv.circle(resized, center, radius, (0, 234, 255), 3)

Munculkan gambarnya!

Munculkan gambar dengan fungsi cv2.imshow()

cv.imshow("detected circles", resized)
cv.waitKey(0)

Hasil script diatas adalah berupa gambar seperti berikut:

Oops, ternyata algoritmanya mendeteksi lebih dari satu lingkaran! Termasuk lingkaran yang salah! Lalu bagaimana memperbaikinya?

Disini kita bisa melihat adanya parameter minRadius. Kita akan melakukan tuning (perbaikan) dan memperbesar minRadius untuk mengurangi lingkaran yang salah pada line 24.

# aplikasikan hough circle
circles = cv.HoughCircles(gray, cv.HOUGH_GRADIENT, 0.5, 20,
                            param1=100, param2=30,
                            minRadius=50, maxRadius=70)

Dan hasilnya, algoritma hough circle hanya mendeteksi lingkaran pada rambu lalu lintas!

Kesimpulan

Kita telah melakukan deteksi lingkaran pada gambar untuk mendeteksi rambu lalu lintas berbentuk lingkaran dengan menggunakan algoritma Hough Circle. Dengan menggunakan library OpenCV, pengolahan citra digital dengan python bukan?

Selanjutnya tugasmu adalah melakukan deteksi lingkaran pada objek lain dan bagikan hasilnya!

Download Source Code

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 *