Penerapan watershed

By | January 17, 2021
409 Views

Watershed biasa digunakan untuk memisahkan objek yang saling berhimpitan, biasanya bisa disiasati menggunakan teknik morfologi seperti erotion, dilation, close, open tapi terkadang teknik tersebut kurang efektif, sehingga perlu menggunakan teknik watershed. Berikut disajikan contoh gambar yang saling berhimpitan terdiri dari 2 objek yang saling berhimpitan.

eucleid distance transform, untuk mendapatkan ‘puncak’

Kita ambil bagian titik tertinggi nya

Ambil bagian titik rendah nya juga

Terapkan operasi labelling, terdapat 3 objek

Terapkan watershed, sehingga terpisah antara objek yang saling berhimpit

Contoh real dalam penerapan watershed yaitu segmentasi objek seperti berikut
http://www.softscients.web.id/2019/02/python-watershed-segmentation.html

Berikut kode yang menggunakan numpy, opencv, dan matplotlib

# %% # Tahap cara kerja watershed
#' 14/06/2019 #'mulkan.ms@gmail.com

#'pustaka yang diperlukan

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

from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter

cv_img = cv2.imread('2 objek.png',0)
sure_bg = cv_img.copy()
#'Kita mempunyai gambar berikut
#'terdiri dari 2 objek yang saling berhimpitan
plt.figure(),plt.imshow(sure_bg,cmap='gray'),plt.title('image original')
plt.show()

#'terapkan distanceTransform
dist_transform = cv2.distanceTransform(sure_bg,cv2.DIST_L2,5)
plt.figure(),plt.imshow(dist_transform,cmap='gray'),plt.title('Eucleid Distance Transform')
plt.show()


#'ambil bagian titik tertinggi
ret, titik_puncak = cv2.threshold(dist_transform,0.75*dist_transform.max(),255,0)
plt.figure(),plt.imshow(titik_puncak,cmap='gray'),plt.title('titik_puncak')
plt.show()

#'ambil bagian bagian luar nya
threshold = titik_puncak.copy()
titik_puncak = np.uint8(titik_puncak)
titik_rendah = cv2.subtract(sure_bg,titik_puncak)
plt.figure(),plt.imshow(titik_rendah,cmap='gray'),plt.title('titik_rendah')
plt.show()

#'terapkan labelling
ret, markers = cv2.connectedComponents(titik_puncak) 
markers = markers+1 
markers[titik_rendah==255] = 0
plt.figure(),plt.imshow(markers,cmap='Spectral'),plt.title('markers '+str(np.max(markers)))


#'input image watershed harus berupa RBG
#'maka diubah terlebih dahulu
backtorgb = cv2.cvtColor(cv_img,cv2.COLOR_GRAY2RGB)


#'terapkan watershed
markers = cv2.watershed(backtorgb,markers)
plt.figure()
plt.imshow(np.uint8(markers),cmap='gray'),plt.title('Batas Watershed')
plt.show()

Leave a Reply

Your email address will not be published.




Enter Captcha Here :