Rabu, 27 November 2019

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.


 
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 ')


Atau menggunakan scikit-image dengan kode sebagai berikut


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



Tidak ada komentar: