參考博客:https://segmentfault.com/a/1190000015690356
分水嶺watershed 部分:
https://blog.csdn.net/u010741471/article/details/45193521
曼哈頓棋盤格距離:
代碼如下:
import cv2 as cv import numpy as np def water_shed(image): #1 去噪,灰度,二值化 blurred = cv.pyrMeanShiftFiltering(image,10,30) # blurred=cv.bilateralFilter(image,0,50,5) # cv.imshow('blurred',blurred) gray=cv.cvtColor(blurred,cv.COLOR_BGR2GRAY) ret,binary=cv.threshold(gray,0,255,cv.THRESH_BINARY|cv.THRESH_OTSU) # cv.imshow('binary',binary) #2. mophology 開操作去除噪點 kernel=cv.getStructuringElement(cv.MORPH_RECT,(3,3)) open_binary=cv.morphologyEx(binary,cv.MORPH_OPEN,kernel,iterations=2) #mophology binary,2次開操作 cv.imshow('1-open-op',open_binary) dilate_bg=cv.dilate(open_binary,kernel,iterations=3) #3次膨脹 cv.imshow('2-dilate-op',dilate_bg) #3.distance transform # DIST_L1:曼哈頓距離,DIST_L2:歐氏距離,masksize:跟卷積一樣 dist=cv.distanceTransform(open_binary,cv.DIST_L2,3) #?? dist_norm=cv.normalize(dist,0,1.0,cv.NORM_MINMAX)# 0-1之間標准化 cv.imshow('3-distance-t',dist_norm*50) ret,surface=cv.threshold(dist,dist.max()*0.65,255,cv.THRESH_BINARY) cv.imshow('4-surface',surface) #4計算marker surface_fg=np.uint8(surface) #計算前景 unknown=cv.subtract(dilate_bg,surface_fg) #計算未知區域 cv.imshow('5-unknown',unknown) ret,markers=cv.connectedComponents(surface_fg) #通過計算cc,計算markers print(ret) cv.imshow('6-markers',markers) #5 watershed 分水嶺變換 markers=markers+1 #用label進行控制 markers[unknown==255]=0 markers=cv.watershed(image,markers) #分水嶺的地方就編程-1 image[markers==-1]=[0,0,255] cv.imshow('7-result',image) src = cv.imread("coins.jpg") # cv.imshow("gray_img", src) water_shed(src) cv.waitKey(0) cv.destroyAllWindows()