Wednesday, November 27, 2019

Belajar Edge Detection dengan Sobel

Operasi morfologi yang banyak digunakan untuk binary yaitu edge detection. Ada banyak jenis-jenis edge detection yaitu sobel, prewit, robert, dan canny yang dibedakan atas jenis kernelnya. Pada postingan yang akan dibahas ini yaitu sobel. Kenapa Dibahas? walaupun sudah banyak membahas dokumentasinya juga! dikarenakan untuk memperjelas penggunaan deteksi sobel yang di dokumentasi opencv terdiri dari arah sumbu X dan sumb Y serta ada penggunaan library skimage (scikit image)


Edge Detection menggunakan operator Sobel bisa dilakukan dengan teknik menggabungkan  gradient, lebih lanjut kamu bisa ulasan berikut ini agar kamu lebih mengerti edge detection Sobel. Sebagai bahan percobaan bahwa gambar input yang digunakan berformat grayscale bukan hitam putih seperti diatas postingan ini, maka agar dibaca grayscale oleh OpenCV, cukup berikan flag=0


test_image = cv2.imread('bunga.jpg',0)

maka test_image akan berformat uint8 yang berarti unsigned integer alias bilangan bulat positif (tidak mengandung koma) dengan nilai rentang 2^8 atau dari 0 sampai dengan 255.



OpenCV - Operator Sobel


Edge detection / Deteksi tepi operator sobel pada OpenCV  menggunakan function berikut


cv2.Sobel(original_image,ddepth,xorder,yorder,kernelsize)


Sehingga ada 2 arah yaitu sobel_x dan sobel_y



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


test_image = cv2.imread('bunga.jpg',0) #gambar dibaca grayscale

#cv2.Sobel(original_image,ddepth,xorder,yorder,kernelsize)
#tanda cv2.CV_64F adalah format grayscale 64 bit (true color)
#sedangkan cv2.CV_8U adalah format binary atau 8 bit (hitam putih)
sobelx = cv2.Sobel(test_image,cv2.CV_64F,1,0,ksize=3)
sobely = cv2.Sobel(test_image,cv2.CV_64F,0,1,ksize=3)

plt.figure()
plt.subplot(1,2,1),plt.imshow(sobelx,cmap='gray'),plt.title('Penerapan Sobel X')
plt.subplot(1,2,2),plt.imshow(sobely,cmap='gray'),plt.title('Penerapan Sobel Y')



Agar didapatkan egde, maka perlu kita terapkan rumus berikut
Dengan G disebut gradient dan theta disebut dengan orientation.
Sehingga kode lengkap untuk rumus diatas bila diterapkan menjadi berikut


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


test_image = cv2.imread('bunga.jpg',0) #gambar dibaca grayscale

#cv2.Sobel(original_image,ddepth,xorder,yorder,kernelsize)
#tanda cv2.CV_64F adalah format grayscale 64 bit (true color)
#sedangkan cv2.CV_8U adalah format binary atau 8 bit (hitam putih)
sobelx = cv2.Sobel(test_image,cv2.CV_64F,1,0,ksize=3)
sobely = cv2.Sobel(test_image,cv2.CV_64F,0,1,ksize=3)

plt.figure()
plt.subplot(1,2,1),plt.imshow(sobelx,cmap='gray'),plt.title('Penerapan Sobel X')
plt.subplot(1,2,2),plt.imshow(sobely,cmap='gray'),plt.title('Penerapan Sobel Y')



G = np.sqrt(sobely**2+sobelx**2)
theta = np.arctan2(sobely, sobelx)

plt.figure()
plt.imshow(np.uint8(G),cmap='gray')
plt.title('Penerapan Sobel ')



Scikit Image Operator Sobel

Kalau kamu tidak ingin ribet, bisa menggunakan scikit-image atau disingkat dengan skimage, kodenya sangat simple sekali hanya meggunakan function sobel

from skimage.filters import  sobel


import cv2
import numpy as np
from matplotlib import pyplot as plt
from skimage.filters import  sobel

test_image = cv2.imread('bunga.jpg',0) #gambar dibaca grayscale


edge_sobel = sobel(test_image)

plt.figure()
plt.imshow(edge_sobel,cmap='gray')
plt.title('Penerapan Sobel skimage ')





Perbedaan hasil dikarenakan perbedaan jenis kernel yang digunakan, bila ingin menggunakan jenis kernel yang lain, bisa menggunakan teknik convolution



Ref:

https://towardsdatascience.com/canny-edge-detection-step-by-step-in-python-computer-vision-b49c3a2d8123
https://scikit-image.org/docs/dev/auto_examples/edges/plot_edge_filter.html
https://www.tutorialspoint.com/opencv/opencv_sobel_operator.htm 



No comments: