dist_transform = cv2.distanceTransform(opening1,cv2.DIST_L2,5)
ret, sure_fg = cv2.threshold(dist_transform,0.7*dist_transform.max(),255,2)
sure_fg = np.uint8(sure_fg)
unknown = cv2.subtract(opening2,first_try)
print(unknown)
ret, markers = cv2.connectedComponents(first_try)
markers = markers+1
markers[unknown==255] = 0
markers = cv2.watershed(img,markers)
#cv2.imshow("markers", markers)
img[markers == -1] = [255,0,0]
image, contours, hierarchy = cv2.findContours(markers, 2, 1)
for cnt in contours:
(x2, y2, w2, h2) = cv2.boundingRect(cnt)
hull = cv2.convexHull(cnt)
length = len(hull)
if length > 5:
for i in range(length):
cv2.line(img, tuple(hull[i][0]), tuple(hull[(i+1)%length][0]), (0,0,255), 2)
cv2.rectangle(img, (x2, y2), (x2 + w2, y2 + h2), (0, 255, 255), 2)
cv2.putText(img, "OK", (x2, y2 - 5), font, 0.7, (0, 0, 255), 2)
這篇要來介紹我的程式最後結尾的部分,上方一大段的 marker 的部分,他是分水嶺的做法,但是這個做法我算是很粗略的,因為事實上分水嶺的做法中間他是有更多工序的,我算是做的很少,所以初學者們如果我的部分學習起來可以再去看看其他大神的做學習。
dist_transform = cv2.distanceTransform(opening1,cv2.DIST_L2,5)
ret, sure_fg = cv2.threshold(dist_transform,0.7*dist_transform.max(),255,2)
sure_fg = np.uint8(sure_fg)
unknown = cv2.subtract(opening2,first_try)
print(unknown)
ret, markers = cv2.connectedComponents(first_try)
markers = markers+1
markers[unknown==255] = 0
markers = cv2.watershed(img,markers)
img[markers == -1] = [255,0,0]
image, contours, hierarchy = cv2.findContours(markers, 2, 1)
那麼我一一來介紹,首先呢,我們需要把你的影像做一個切割,想像一個圈圈,把圈圈的四個邊圍成正方形,然後利用正方形的特性來找出中心點,因為分水嶺的重點就是找到你的中心點,如果中心點越裡面,他就會越準確,所以前面的程式就是一直在做找中心點的動作,那麼它有個方法是 cv2.subtract 這個是將你所切割好的跟你的原圖做分析,他會將你的兩個圖重疊,看出分水嶺的位置有沒有差很多,接著再將你圓圖一個一個地方當作點做連接,就是做描繪的動作,你的參數都OK之後,就將資料餵給 watershed 而這時候 watershed 就會利用它內部現有的程式碼來做拼接,這時你就可以利用 imshow 來觀看結果如何。
for cnt in contours:
(x2, y2, w2, h2) = cv2.boundingRect(cnt)
hull = cv2.convexHull(cnt)
length = len(hull)
if length > 5:
for i in range(length):
cv2.line(img, tuple(hull[i][0]), tuple(hull[(i+1)%length][0]), (0,0,255), 2)
cv2.rectangle(img, (x2, y2), (x2 + w2, y2 + h2), (0, 255, 255), 2)
cv2.putText(img, "OK", (x2, y2 - 5), font, 0.7, (0, 0, 255), 2)
上方這套程式碼,其實看起來怎麼參數這麼多,其實沒什麼他就是在畫線而已,仔細一看他就是在設定線,文字,形狀各種參數。
那麼這篇就介紹到這邊,我們下篇會開始介紹一些細節功能,我們來細部做學習。
吸收許多知識,使自己更壯大