Wednesday, November 27, 2019

Buku Pengolahan Citra Digital dengan Python dan OpenCV-Edge Detection dengan Sobel


Seiring dengan meningkatnya traffic dan kemudahan dalam mengelola content, kami mengucapkan banyak terima kasih kepada para pembaca setia pada blog www.softscients.web.id

Per 19 Maret 2020, kami sedang melakukan migrasi ke domain dan hosting yang lebih baik yaitu
Semoga dengan alamat domain dan hosting terbaru akan semakin memudahkan para pembaca dalam mencari materi/content. Migrasi dilakukan secara bertahap yang membutuhkan waktu yang cukup lama jadi jangan kuatir selama migrasi akan dilakukan secara hati-hati untuk memimalkan broken link


kalian bisa lanjut baca lagi di  http://softscients.com/2020/03/30/buku-pengolahan-citra-digital-dengan-python-dan-opencv-edge-detection-dengan-sobel/


Sinopsis

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
$$|G|=\sqrt{I_{x}^2+I_{y}^2}$$
$$\theta(x,y)=arctan \begin{pmatrix} \frac{I_y}{I_x} \end{pmatrix}$$

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:

Post a Comment