Rabu, 16 Desember 2020

OPENCV Canny Edge Detection¶

dalam tutorial ini kitas akan mempelajari cany detection dan fungi dari cv2.Canny()
Teori¶
Canny Edge Detection adalah algoritma deteksi tepi yang populer. Ini dikembangkan oleh John F. Canny pada tahun 1986. Ini adalah algoritma multi-tahap dan kita akan melalui setiap tahapan.

Pengurangan kebisingan
Karena deteksi tepi rentan terhadap noise pada gambar, langkah pertama adalah menghilangkan noise pada gambar dengan filter Gaussian 5x5. Kami telah melihat ini di bab sebelumnya.

Menemukan Gradien Intensitas Gambar
Citra yang telah dihaluskan kemudian disaring dengan kernel Sobel baik horizontal maupun vertikal untuk mendapatkan turunan pertama dalam arah horizontal (G_x) dan arah vertikal (G_y). Dari kedua gambar tersebut, kita dapat menemukan gradien tepi dan arah untuk setiap piksel sebagai berikut:

Edge\_Gradient \; (G) = \sqrt{G_x^2 + G_y^2}

Angle \; (\theta) = \tan^{-1} \bigg(\frac{G_y}{G_x}\bigg)
Arah gradien selalu tegak lurus dengan tepi. Ini dibulatkan ke salah satu dari empat sudut yang mewakili arah vertikal, horizontal dan dua arah diagonal.

Penindasan Non-maksimum
Setelah mendapatkan besaran dan arah gradien, pemindaian penuh gambar dilakukan untuk menghilangkan piksel yang tidak diinginkan yang mungkin bukan merupakan tepi. Untuk ini, pada setiap piksel, piksel diperiksa jika itu adalah maksimum lokal di lingkungannya dalam arah gradien. Periksa gambar di bawah ini:

Non-Maximum Suppression

Titik A ada di pinggir (dalam arah vertikal). Arah gradien normal ke tepi. Titik B dan C berada dalam arah gradien. Jadi titik A diperiksa dengan titik B dan C untuk melihat apakah itu membentuk maksimum lokal. Jika demikian, maka akan dipertimbangkan untuk tahap berikutnya, jika tidak maka akan ditekan (dimasukkan ke nol).

Singkatnya, hasil yang Anda dapatkan adalah gambar biner dengan "tepi tipis".

Histeresis Thresholding
Tahap ini memutuskan mana semua sisi yang benar-benar tepian dan mana yang tidak. Untuk ini, kami membutuhkan dua nilai ambang, minVal dan maxVal. Setiap tepi dengan gradien intensitas lebih dari maxVal pasti merupakan tepi dan yang di bawah minVal pasti bukan tepi, jadi buang. Mereka yang berada di antara dua ambang batas ini diklasifikasikan sebagai tepi atau non-tepi berdasarkan konektivitas mereka. Jika mereka terhubung ke piksel “sure-edge”, mereka dianggap sebagai bagian dari edge. Jika tidak, mereka juga akan dibuang. Lihat gambar di bawah ini:

Hysteresis Thresholding



tepi A berada di atas maxVal, sehingga dianggap sebagai "edge-pasti". Meskipun edge C berada di bawah maxVal, namun terhubung ke edge A, sehingga juga dianggap sebagai edge yang valid dan kami mendapatkan kurva penuh tersebut. Tetapi tepi B, meskipun berada di atas minVal dan berada di wilayah yang sama dengan tepi C, ia tidak terhubung ke "tepi-pasti", sehingga dibuang. Jadi, sangat penting bagi kami untuk memilih minVal dan maxVal yang sesuai untuk mendapatkan hasil yang benar.

Tahap ini juga menghilangkan noise piksel kecil dengan asumsi bahwa tepinya adalah garis panjang.

Jadi yang akhirnya kami dapatkan adalah tepi yang kuat pada gambar.

Deteksi Tepi Canny di OpenCV¶
OpenCV menempatkan semua hal di atas dalam fungsi tunggal, cv2.Canny (). Kami akan melihat cara menggunakannya. Argumen pertama adalah gambar masukan kami. Argumen kedua dan ketiga adalah minVal dan maxVal kami masing-masing. Argumen ketiga adalah aperture_size. Ini adalah ukuran kernel Sobel yang digunakan untuk menemukan gradien gambar. Standarnya adalah 3. Argumen terakhir adalah gradien L2 yang menentukan persamaan untuk mencari besaran gradien. Jika Benar, itu menggunakan persamaan yang disebutkan di atas yang lebih akurat, jika tidak menggunakan fungsi ini:
Edge\_Gradient \; (G) = |G_x| + |G_y|

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('messi5.jpg',0)
edges = cv2.Canny(img,100,200)

plt.subplot(121),plt.imshow(img,cmap = 'gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(edges,cmap = 'gray')
plt.title('Edge Image'), plt.xticks([]), plt.yticks([])

plt.show()

Canny Edge Detection



Tidak ada komentar:

Posting Komentar