进行图像中对象的分割
(1)灰度化
(2)二值
(3)距离变换
(4)寻找种子
(5)生成Marker
(6)分水岭变换
#引入opencv模块
import cv2 as cv
#引入numpy模块
import numpy as np
#引入sys模块
import sys
#分水岭
def watershed_test(img):
blurred = cv.pyrMeanShiftFiltering(img,10,100)
#gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
gray = cv.cvtColor(blurred,cv.COLOR_BGR2GRAY)
ret,binary = cv.threshold(gray,0,255,cv.THRESH_BINARY|cv.THRESH_OTSU)
print("threshold value: %s"%(ret)) #分割的阈值
cv.namedWindow("binary_img",cv.WINDOW_NORMAL)
cv.imshow("binary_img",binary)
#如有需要,进行下面的形态学操作
kernel = cv.getStructuringElement(cv.MORPH_RECT,(3,3))
mb = cv.morphologyEx(binary,cv.MORPH_OPEN,kernel,iterations=2)
sure_bg = cv.dilate(mb,kernel,iterations=3)
cv.namedWindow("morphology_img",cv.WINDOW_NORMAL)
cv.imshow("morphology_img",sure_bg)
#距离变换
dist = cv.distanceTransform(mb,cv.DIST_L2,3)
dist_output = cv.normalize(dist,0,1.0,cv.NORM_MINMAX)
cv.namedWindow("distance_img",cv.WINDOW_NORMAL)
cv.imshow("distance_img",dist_output*50)
ret,surface = cv.threshold(dist,dist.max()*0.6,255,cv.THRESH_BINARY)
cv.namedWindow("surface_bin_img",cv.WINDOW_NORMAL)
cv.imshow("surface_bin_img",surface)
surface_fg = np.uint8(surface)
unknown = cv.subtract(sure_bg,surface_fg)
ret,markers = cv.connectedComponents(surface_fg)
print(ret)
#分水岭变换
markers = markers + 1
markers[unknown==255] = 0
markers = cv.watershed(img,markers = markers)
img[markers==-1] = [0,0,255]
cv.namedWindow("result_img",cv.WINDOW_NORMAL)
cv.imshow("result_img",img)
def img_test():
#img = cv.imread('E:/chenopencvblogimg/coin.jpg')
img = cv.imread('E:/chenopencvblogimg/coin2.png')
#判断是否读取成功
if img is None:
print("Could not read the image,may be path error")
return
cv.namedWindow("origin Pic",cv.WINDOW_NORMAL)
cv.imshow("origin Pic",img)
watershed_test(img)
#让显示等待键盘输入维持在那里,否则程序跑完就闪退啦!
cv.waitKey(0)
#销毁窗口
cv.destroyAllWindows()
if __name__ == '__main__':
sys.exit(img_test() or 0)