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
.
Daftar isi
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 adalahcv2.HOUGH_GRADIENT
.dp
: Parameter ini adalah rasio terbalik dari akumulator resolusi pada gambar. Kamu bisa melihat penjelasan lebih lengkapnya pada jurnal Yuen dkk. Semakin besardp
, 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 olehcv2.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”.
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!