Sabtu, 15 Juni 2019

Python - Step by Step Penerapan watershed

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





Sebagai informasi, bahwa tools yang digunakan menggunakan python, matplotlib, numpy dan opencv, jadi bila bagi pemula yang ingin belajar mengenai python silahkan beli buku saya di

http://www.softscients.web.id/2018/11/buku-belajar-mudah-python-dengan.html

Bisa beli disini
  1. https://www.bukalapak.com/p/hobi-koleksi/buku/komputer-487/wco01c-jual-belajar-mudah-python-dengan-package-open-source-mulkan-syarif-graha-ilmu
  2. https://www.tokopedia.com/bukukuliahan/belajar-mudah-python-dengan-package-open-source-mulkan-syarif
  3. https://togamas.com/detail-buku-8585=Belajar_Mudah_Python_dengan_Package_Open_Source_
  4. https://petramas.co.id/product/belajar-mudah-python-dengan-package-open-source-a8c4 
Pembahasan buku yaitu
  1. Python
  2. IDE Spyder sebagai Editor
  3. Package Numpy untuk perhitungan array
  4. Package Matplolib untuk visualisasi grafis
  5. Package Pandas untuk pengolahan data terstruktur
  6. Package Scipy untuk pengolahan data statistika
  7. Package OpenCV (instal tersendiri)

Langkah selanjutnya 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()





Tidak ada komentar: