Indonesian (Bahasa Indonesia) translation by Adib Maulana (you can also view the original English article)
Deteksi tepi adalah teknik analisis gambar yang penting ketika seseorang tertarik untuk mengenali objek dengan garis besarnya, dan juga dianggap sebagai langkah penting dalam memulihkan informasi dari gambar.
Sebagai contoh, fitur-fitur penting seperti garis dan kurva dapat diekstraksi menggunakan deteksi tepi, yang kemudian biasanya digunakan oleh visi komputer tingkat tinggi atau algoritma pemrosesan gambar. Algoritme deteksi tepi yang baik akan menyoroti lokasi tepi utama dalam gambar, sementara pada saat yang sama mengabaikan tepi palsu yang disebabkan oleh noise.
Tapi apa sih ujung-ujungnya? Tepi adalah fitur gambar yang dapat digunakan dalam memperkirakan dan menganalisis struktur objek dalam suatu gambar Mereka mewakili perubahan lokal yang signifikan yang terjadi dalam intensitas gambar (mis. Nilai piksel). Tepian biasanya terjadi pada batas antara dua wilayah berbeda dalam gambar.
Dalam tutorial ini, saya akan menjelaskan algoritma Canny edge detector, dan bagaimana kita dapat mengimplementasikannya dengan Python.
Canny Edge Detector
Algoritma Canny edge detector dinamai penemunya, John F. Canny, yang menemukan algoritma pada tahun 1986. Canny Detektor tepi biasanya mengambil gambar skala abu-abu sebagai input dan menghasilkan gambar yang menunjukkan lokasi diskontinuitas intensitas sebagai output (yaitu tepi) .
Saya tidak ingin menggunakan matematika di sini, tetapi saya akan menjelaskan apa yang terjadi di balik layar dalam algoritma Canny edge detector dari sudut pandang tingkat tinggi.
Hal pertama yang dilakukan oleh Canny edge detector adalah menggunakan Gaussian convolution untuk menghaluskan gambar input dan menghilangkan noise. Operator turunan pertama kemudian diterapkan pada gambar yang dihaluskan untuk menyoroti daerah-daerah gambar dengan turunan spasial pertama yang tinggi.
Algoritma kemudian menemukan besarnya gradien dan arah dengan menghitung turunan-x dan turunan-y, terutama karena mengetahui arah gradien sebenarnya memungkinkan kita untuk menemukan arah tepian.
Algoritme kemudian melakukan apa yang disebut penindasan non-maksimal, di mana ia melacak di sepanjang puncak yang naik dari tepi, dan menetapkan piksel-piksel yang tidak di atas bubungan ke nol, akhirnya menghasilkan garis tipis pada hasilnya.
Dengan kata lain, kami memeriksa apakah gradien yang dihitung pada langkah sebelumnya dianggap maksimum di antara titik-titik tetangga yang terletak di kedua arah positif dan negatif dari gradien. Jika gradien maksimum, itu dianggap sebagai bagian dari tepi, dan sebaliknya.
Proses pelacakan di atas dikontrol oleh dua ambang batas, t1 dan t2, sehingga t1> t2, disebut sebagai ambang batas histeresis. Pelacakan dimulai pada titik di punggungan lebih tinggi dari t1, dan kemudian berlanjut di kedua arah keluar dari titik itu sampai ketinggian punggungan menjadi kurang dari t2.
Jadi, pada dasarnya, yang terjadi di sini adalah bahwa kami memilih semua titik tepi yang berada di atas ambang atas t1, dan kemudian menyelidiki apakah ada tetangga dari titik-titik ini yang dianggap di bawah ambang atas t1 dan di atas ambang bawah t2. Dalam hal ini, tetangga seperti itu akan menjadi bagian dari tepi
Dengan demikian, lebar kernel Gaussian yang digunakan untuk menghaluskan gambar input, dan t1 (atas) dan ambang t2 (lebih rendah) yang digunakan oleh pelacak, adalah parameter yang menentukan efek dari detektor tepi cerdik.
Implementasi Python
Pada bagian ini, saya akan menjelaskan dua cara di mana kita dapat mengimplementasikan Canny edge detector. Satu cara menggunakan pustaka scikit-image, dan yang lainnya menggunakan pustaka OpenCV.
Canny Edge Detector Menggunakan scikit-image
Jika Anda belum menginstal scikit-image pada mesin Anda, silakan dan instal dengan mengikuti instruksi yang ditunjukkan pada halaman install scikit-image.
Karena saya menggunakan mesin Ubuntu, saya hanya perlu menjalankan perintah berikut di Terminal saya untuk menjalankan dan menjalankan perpustakaan:
1 |
sudo apt-get install python-skimage |
Pustaka scikit-image memiliki fungsi canny () yang dapat kita gunakan untuk menerapkan detektor tepi Canny pada gambar kita. Perhatikan bahwa fungsi ini merupakan bagian dari modul feature.
Sebelum bergerak maju, mari gunakan gambar mainan untuk bereksperimen. Anda dapat menggunakan gambar apa pun. Saya akan menggunakan gambar boat.png yang ditunjukkan di bawah ini (klik tautan untuk mengunduh gambar):



Tanpa basa-basi lagi, mari kita lihat bagaimana kita dapat mendeteksi tepi pada gambar di atas (mis. Perahu) menggunakan Canny edge detector. Ingat bahwa gambar kita harus abu-abu. Karena gambar kita sudah skala abu-abu, kita tidak perlu melakukan apa-apa pada saat ini, seperti mengubah gambar dari warna ke skala abu-abu. Script untuk Canny edge detector terlihat sebagai berikut:
1 |
from skimage import io |
2 |
from skimage import feature |
3 |
|
4 |
im = io.imread('boat.png') |
5 |
edges = feature.canny(im) |
6 |
io.imshow(edges) |
7 |
io.show() |
Jadi, seperti yang Anda lihat, pertama-tama kita membaca gambar kita, boat.png. Setelah itu, kami menerapkan fungsi canny () pada gambar (saya tidak melewatkan parameter khusus apa pun, kecuali gambar kami, dan membiarkannya pada fungsi default). Akhirnya, kami menampilkan hasil kami yang menunjukkan tepi terdeteksi. Hasil skrip di atas terlihat sebagai berikut:



Anda dapat bermain-main dengan parameter untuk mendapatkan hasil yang berbeda tentang bagaimana tepi terdeteksi. Tetapi hasilnya terlihat bagus dengan tepi yang terdeteksi, bukan?!
Canny Edge Detector Menggunakan OpenCV
Pada bagian ini, kita akan melihat bagaimana kita dapat menggunakan OpenCV untuk menerapkan detektor tepi Canny pada gambar kapal kita. Jika Anda belum menginstal OpenCV, lanjutkan dan instal. Anda dapat memeriksa artikel berikut tentang bagaimana Anda dapat menginstal OpenCV pada mesin Anda. Saya telah memasukkan artikel yang berbeda untuk sistem operasi yang berbeda:
- Ubuntu 16.04: Bagaimana cara menginstall OpenCV
- Instal OpenCV-Python di Windows
- Instal OpenCV 3 di macOS
Seperti halnya pustaka scikit-image, OpenCV juga memiliki fungsi yang disebut canny () untuk menerapkan algoritma detektor tepi Canny pada gambar. Script berikut menunjukkan bagaimana kita dapat menggunakan OpenCV untuk menemukan tepi pada gambar kita:
1 |
import cv2 |
2 |
import matplotlib.pyplot as plt |
3 |
|
4 |
im = cv2.imread('boat.png') |
5 |
edges = cv2.Canny(im,25,255,L2gradient=False) |
6 |
plt.imshow(edges,cmap='gray') |
7 |
plt.show() |
Perhatikan bahwa saya telah melewati berikut ini sebagai argumen ke fungsi Canny ():
-
im: nama gambar -
lower threshold: 25 -
upper threshold: 255 -
L2gradient=False: ini berarti bahwa L1-norm digunakan. Jika disetel keTrue, L2-norm akan digunakan.
Perpustakaan matplotlib kemudian telah digunakan untuk memplot hasil. Untuk mempelajari lebih lanjut tentang perpustakaan ini, periksa tutorial saya: Memperkenalkan Perpustakaan Matplotlib Python
Hasil skrip di atas adalah sebagai berikut:



Kesimpulan
Dalam tutorial ini, kita telah belajar tentang detektor tepi Canny dan melihat bagaimana scikit-image dan pustaka OpenCV memungkinkan kita untuk dengan mudah mengimplementasikan detektor ini dengan beberapa baris kode.



