今天要來跟大家介紹何謂分水嶺,其實簡單介紹是說,今天如果有兩個東西重疊的時候,但是我不要很隨便的一起辨識,我要這兩個刻意分開辨識,那這樣就叫做分水嶺,不過這個做法有一個盲點,如果你不是透過訓練方式,不可能每張圖可以做到分水嶺,如果是做固定的,只能在特定幾張圖做到分水嶺動作。
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('coins.png')
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
ret, thresh = cv.threshold(gray,0,255,cv.THRESH_BINARY_INV+cv.THRESH_OTSU)
kernel = np.ones((3,3),np.uint8)
opening = cv.morphologyEx(thresh,cv.MORPH_OPEN,kernel, iterations = 2)
sure_bg = cv.dilate(opening,kernel,iterations=3)
dist_transform = cv.distanceTransform(opening,cv.DIST_L2,5)
ret, sure_fg = cv.threshold(dist_transform,0.7*dist_transform.max(),255,0)
sure_fg = np.uint8(sure_fg)
unknown = cv.subtract(sure_bg,sure_fg)
ret, markers = cv.connectedComponents(sure_fg)
markers = markers+1
markers[unknown==255] = 0
markers = cv.watershed(img,markers)
img[markers == -1] = [255,0,0]
上方程式碼,我從參考資料取得,人家是用硬幣來做一個介紹,這其中很多方法我在先前有介紹過,分水嶺的主要功能為 watershed 但是這個方法必須要先前先做出標點,讓他知道說有那些地方需要做分水嶺,最後再用這個模組才能成立,首先你必須一樣要將圖片做 Threshold 方式來進行黑白的辨識方式,接著你要做膨脹以及侵蝕的效果讓他的個體點縮小,讓她變成一個點之後,將這些點利用特徵方式一個一個的標示出來,最後這些會變成一個參數 markers 這些 markers 就是協助你幫忙判斷他們都是個別的個體。
但是像這樣針對硬幣的部分如果套上水果的話.....
大家看一下可能會覺得,感覺還行呀,但是有個問題,這個只是背景為白色的番茄圖,如果背景是很鮮豔的果園的話,這個狀態可是慘不忍睹的,所以我們如果要讓他看起來完整一點,通常這個結果要做膨脹將黑點消除,消除完畢就可以呈現完整的番茄,但是也不能百分之百,最好放入訓練是最容易的。
以上就是介紹分水嶺的概念 cv2.watershed 這個在重疊的物體上非常好用,大家可以去操作操作試試看
那麼我們下篇見摟 謝謝大家觀看。
參考資料
雜亂的物品,利用好好的分類,就可以看出物品的樣貌,非常的方便!!