Corner Detection

By | January 8, 2022
Print Friendly, PDF & Email
903 Views

Corner Detection – merupakan algoritma morfologi sering kita temui implementasinya pada aplikasi scanner untuk deteksi ujung dari sebuah dokumen. Corner detection berfungsi untuk perhitungan operasi deskewing karena user dalam melakukan capture gambar tidak tegak lurus. Pada pembahasan sebelumnya kita telah menerapkan deteksi lokasi koordinat gambar dengan mouse.

Tahap selanjutya kita diberikan demo cara menggunakan click mouse untuk mendapatkan nilai pixel serta sedikit operasi deskewing tapi ada sedikit kendala yaitu menentukan ke 4 titik lokasi dokumen dilakukan secara manual, oleh sebab itu kita akan bahas mengenai corner detection

Homografi

Gambar digital suatu objek dapat dipahami sebagai contoh persepsi objek yang diproyeksikan pada bidang kamera. Sebuah objek dapat dirasakan dengan cara yang berbeda sehubungan dengan orientasi kamera. Misalnya, proyeksi (gambar) yang kita peroleh ketika bidang kamera dan objek ditempatkan sejajar satu sama lain berbeda dari proyeksi yang kita peroleh ketika ditempatkan miring. Pada dasarnya, proyeksi yang berbeda (pada bidang yang sama) dapat dipertukarkan. Homografi adalah konsep yang dapat membantu kita untuk melakukan reverse-membalikan operasi tersebut.

Secara formal, Homografi (atau kadang-kadang collineation) adalah pemetaan dari sebuah objek ke dirinya sendiri sedemikian rupa sehingga collinearity dari setiap set titik dipertahankan. Pemetaan homografi H antara dua titik x dan x` dapat direpresentasikan sebagai:

    \[ \begin{pmatrix} x'_1\\ x'_2\\ x'_3\\ \end{pmatrix} = \begin{pmatrix} h_{11} & h_{12} & h_{13}\\ h_{21} & h_{22} & h_{23}\\ h_{31} & h_{32} & h_{33}\\ \end{pmatrix} \cdot \begin{pmatrix} x_1\\ x_2\\ x_3\\ \end{pmatrix} \]

Pada pembahasan dibawah ini hanya sampai pada corner detection, adapun untuk deskewing nanti dibahas tersendiri

Algoritma corner detection Shi-Tomashi

Shi-Tomashi algorithm to detect corners – yang cukup robust digunakan dan yang lebih happy adalah telah diimplementasikan di OpenCV! jadi kita tidak usah repot buat algoritma untuk digunakan pada aplikasi. Pembahasan akan dibuat bertingkat yaitu menggunakan gambar yang bagus tidak ada noise dan selanjutnya menggunakan pre prosessing operasi morfologi. Perhatikan gambar berikut

See also  Computer Vision Annotation Tool

Penerapan corner detection seperti berikut

Kode yang digunakan untuk corner detection sebagai berikut, perhatikan perintah  corners = cv2.goodFeaturesToTrack(gray, 4, 0.01, 100)

 

import cv2
import numpy as np
from matplotlib import pyplot as plt
def shi_tomashi(image):
    """
    Use Shi-Tomashi algorithm to detect corners
    Args:
        image: np.array
    Returns:
        corners: list
    """
    gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
    corners = cv2.goodFeaturesToTrack(gray, 4, 0.01, 100)
    corners = np.int0(corners)
    corners = sorted(np.concatenate(corners).tolist())
    print('\nLokasi corner...\n')

    im = image.copy()
    for index, c in enumerate(corners):
        x, y = c
        cv2.circle(im, (x, y), 3, 255, -1)
        character = chr(65 + index)
        print(character, ':', c)
        cv2.putText(im, character, tuple(c), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 5, cv2.LINE_AA)

    plt.imshow(im)
    plt.title('Corner Detection: Shi-Tomashi')
    plt.show()
    return corners

image = cv2.imread('corner2.png')
shi_tomashi(image)

hasilnya

Lokasi corner...

A : [160, 336]
B : [422, 492]
C : [459, 88]
D : [817, 220]

Algoritma corner detection approx PolyDP

Pada pembahasan diatas, gambarnya sangat bagus alias mulustrasi tidak perlu diterapkan operasi njlimet tapi apa iya kita akan sering temui hal diatas pada real application? tentu tidak bukan? pasti akan ada banyak sekali noise seperti cahaya tidak merata, objek bergabung dengan lainnya. Operasi thresholding dan morfologi sangat berperan dalam hasil nantinya. Perhatikan gambar berikut (selain pakai OpenCV, saat ini banyak koq tersedia SDK siap pakai khusus untuk menangani kasus-kasus seperti ini)

beruntungnya kita, karena sebagian besar dokumen saat ini banyak tersedia selalu berwarna putih akan sangat jarang kita temui dokumen berwarna hitam. Operasi pre processing akan kita terapkan seperti bluring agar semakin homogen pixelnya serta BW dengan otsu

image = cv2.imread('4. corner detection.png')
gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
kernel = np.ones((5, 5), np.float32) / 15
filtered = cv2.filter2D(gray, -1, kernel)

plt.imshow(cv2.cvtColor(filtered, cv2.COLOR_BGR2RGB))
plt.title('Filtered Image')
plt.show()

ret, thresh = cv2.threshold(filtered, 250, 255, cv2.THRESH_OTSU)
plt.imshow(cv2.cvtColor(thresh, cv2.COLOR_BGR2RGB))
plt.title('OTSU threshold')
plt.show()

 

 

 

Langkah selanjutnya adalah deteksi objek yang berukuran besar! di Matlab menggunakan operasi blob kalau di OpenCV dikenal dengan istilah contour.

  • Perintah untuk mencari contour  contours, hierarchy = cv2.findContours(img, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
  • sedangkan untuk mencari objek besar menggunakan perintah  cnt = sorted(contours, key=cv2.contourArea, reverse=True)[0]
image_shape = thresh.shape
canvas = np.zeros(image_shape, np.uint8)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
cnt = sorted(contours, key=cv2.contourArea, reverse=True)[0]
cv2.drawContours(canvas, cnt, -1, (255, 255, 255), 3)
plt.title('Contour Terbesar')
plt.imshow(canvas,cmap='gray')
plt.show()

 

See also  Konversi Warna dengan Matlab

 

nanti kita akan corner detection menggunakan perintah  approx_corners = cv2.approxPolyDP(cnt, epsilon, True)

epsilon = 0.02 * cv2.arcLength(cnt, True)
approx_corners = cv2.approxPolyDP(cnt, epsilon, True)
cv2.drawContours(canvas, approx_corners, -1, (255, 255, 0), 10)
approx_corners = sorted(np.concatenate(approx_corners).tolist())
print('\ncorner points yaitu ...\n')
for index, c in enumerate(approx_corners):
    character = chr(65 + index)
    print(character, ':', c)
    cv2.putText(canvas, character, tuple(c), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2, cv2.LINE_AA)

# pengurutan corner
approx_corners = [approx_corners[i] for i in [0, 2, 1, 3]]

plt.imshow(canvas)
plt.title('Corner Points')
plt.show()

 

 

hasil

corner points yaitu ...

A : [45, 105]
B : [169, 579]
C : [295, 123]
D : [433, 463]

ref:

https://ags.cs.uni-kl.de/fileadmin/inf_ags/3dcv-ws11-12/3DCV_WS11-12_lec04.pdf

https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_thresholding/py_thresholding.html

https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_contours/py_contour_features/py_contour_features.html

Leave a Reply