noprianto
noprianto
. 4 min read

Pengenalan Nomor Pelat Mobil dengan OpenCV (Bagian 2)

Bismillah,
masih menyambung postingan saya sebelumnya terkait dengan pengenalan nomor pelat mobil kita telah berhasil melokalisasi atau menemukan lokasi nomor pelat. Pada bagian 2 ini kita akan melakukan segmentasi karakter-karakter yang terdapat pada sebuah pelat hasil pemprosesan sebelumnya.

Segmentasi Karakter Pelat

Segmentasi merupakan sebuah proses memisahkan daerah atau objek yang penting dari sebuah citra. Jika pada citra pelat yang akan dipisahkan adalah karakter yang terdapat pada sebuah pelat, yaitu karakter alfanumerik(kombinasi angka dan huruf). Tidak semua karakter akan disegmentasi, hanya karakter nomor pelat kendaraan saja sedangkan untuk bulan dan tahun berlaku tidak akan disegmentasi.

Hasil deteksi pelat

Gambar di atas merupakan hasil deteksi pelat pada citra inputan yang berhasil dideteksi. Untuk melakukan segmentasi sebenarnya hampir mirip dari metode yang sebelumnya yaitu menggunakan ekstraksi kontur, perbedaannya adalah pada segmentasi karakter pelat disesuaikan ukuran dan rasionya untuk masing-masing karakter. Alur program yang akan kita buat adalah membaca direktori hasil lokalisasi pelat kemudian mengolahnya untuk dilakukan segmentasi, awal kode yang dibuat harus menyertakan depedensi 2 baris kode seperti di bawah ini

import cv2
import os
Konversi menjadi image biner

Seperti preprocessing pada langkah yang sebelumnya, yang harus dilakukan adalah mengubah gambar menjadi biner untuk dilakukan processing yang lebih lanjut. Baris perintah yang digunakan untuk preprocessing tersebut adalah sebagai berikut

# Lokasi hasil pelat
path_plate = "dataset/sliced"

# Looping file di direktori
for name_file in sorted(os.listdir(path_plate)):
    src = cv2.imread(os.path.join(path_plate, name_file))
    blurred = src.copy()
    gray = blurred.copy()

    # Filtering
    for i in range(10):
        blurred = cv2.GaussianBlur(src, (5, 5), 0.5)

    # Ubah ke grayscale
    gray = cv2.cvtColor(blurred, cv2.COLOR_BGR2GRAY)

    # Image binary
    ret, bw = cv2.threshold(gray.copy(), 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
    print(ret, bw.shape)
    cv2.imwrite("segmentasi-bw.jpg", bw)
    # cv2.imshow("bw", bw)
    # cv2.waitKey()

Langkah preprocessing selanjutnya adalah melakukan operasi morfologi, operasi morfologi digunakan untuk memisahkan karakter pelat yang berhimpitan. Baris perintah yang dapat digunakan adalah sebagai berikut

# Image morfologi, opening
    erode = cv2.erode(bw.copy(), cv2.getStructuringElement(cv2.MORPH_OPEN, (3, 6)))
    cv2.imwrite("segmentasi-erode.jpg", erode)
    # cv2.imshow("erode", erode)
    # cv2.waitKey()

Hasilnya morfologi dapat ditampilkan pada gambar di bawah, terlihat bahwa karakter menipis dari hasil binerisasi sebelumnya.

Hasil operasi morfologi

Kemudian ekstraksi kontur dibutuhkan untuk mendapatkan semua kontur yang merupakan kandidat sebuah karakter pelat. Seperti biasanya, kontur harus diseleksi berdasarkan ukuran dan rasio sebuah karakter pelat. Pada bagian ini perlu disesuaikan nilainya, mungkin jika kasus yang berbeda atau dataset yang berbeda nilainya perlu disesuaikan. Nilai pada kode yang saya lampirkan, adalah normatif artinya perlu disesuaikan dengan kebutuhan.

# Ekstraksi kontur
    contours, hierarchy = cv2.findContours(erode.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)

    # Looping contours untuk mendapatkan kontur yang sesuai
    for cnt in contours:
        x, y, w, h = cv2.boundingRect(cnt)
        ras = format(w / h, '.2f')
        # print("x={}, y={}, w={}, h={}, rasio={}".format(x, y, w, h, ras))
        if h >= 40 and w >= 10 and float(ras) <= 1:
            # Gambar segiempat hasil segmentasi warna merah
            cv2.rectangle(src, (x, y), (x + w, y + h), (0, 0, 255), thickness=1)
            print("+ x={}, y={}, w={}, h={}, rasio={}".format(x, y, w, h, ras))
    cv2.imwrite("segmentasi-result.jpg", src)
    cv2.imshow("result", src)
    cv2.waitKey()

Hasil dari potongan kode di atas akan melakukan segmentasi karakter pelat dari gambar inputan dengan ditandai gambar segiempat berwarna merah. Silakan ditambahkan kodenya sedikit agar bisa melakukan croping pada bagian karakter agar dapat dilakukan pengenalan atau proses yang selanjutnya.

Hasil segmentasi

Ada beberapa catatan terkait hasil di atas, masih memungkinkan karakter tertentu yang tersegmentasi bertumpuk atau bersinggungan misalkan jika nanti menemukan karakter huruf D, O, dan angka 0. Selain itu untuk melakukan pembacaan dilakukan dari kiri ke kanan, hal tersebut perlu dilakukan sorting hasil dari karakter yang tersegmentasi. Perlu dilakukan optimize code yang dibuat saat ini, silakan berekperiment terkait kasus atau kondisi tersebut. Full code untuk melakukan segmentasi dapat Anda clone di sini.

Demikianlah artikel saya buat tentang segmentasi karakter pelat nomor mobil, semoga bermanfaat bagi yang yang akan atau lagi belajar OpenCV seperti saya. Ditunggu part yang selanjutnya tentang pengenalan karakter nomor pelat mobil. Happy OpenCV. 🙂

comments powered by Disqus