山东大学暑期实训(十二)
分水岭算法
参考https://www.cnblogs.com/ssyfj/p/9278815.html
(一)获取灰度图像,二值化图像,进行形态学操作,消除噪点
def watershed_demo(image):
blur = cv.pyrMeanShiftFiltering(image,10,100)
gray = cv.cvtColor(blur,cv.COLOR_BGR2GRAY) #获取灰度图像
ret,binary = cv.threshold(gray,0,255,cv.THRESH_BINARY|cv.THRESH_OTSU) #将图像转为黑色和白色部分
cv.imshow(“binary”,binary) #获取二值化图像
#形态学操作,进一步消除图像中噪点
kernel = cv.getStructuringElement(cv.MORPH_RECT,(3,3))
mb = cv.morphologyEx(binary,cv.MORPH_OPEN,kernel,iterations=2) #iterations连续两次开操作,消除图像的噪点
(二)在距离变换前加上一步操作:通过对上面形态学去噪点后的图像,进行膨胀操作,可以得到大部分都是背景的区域(原黑色不是我们需要的部分是背景)
sure_bg = cv.dilate(mb,kernel,iterations=3) #3次膨胀,可以获取到大部分都是背景的区域
(三)使用距离变换distanceTransform获取确定的前景色
根据distanceTransform获取距离背景最小距离的结果(详细看下面相关知识补充)
根据distanceTransform操作的结果,设置一个阈值,使用threshold决定哪些区域是前景,这样得到正确结果的概率很高
dist = cv.distanceTransform(mb,cv.DIST_L2,5) #获取距离数据结果
ret, sure_fg = cv.threshold(dist,dist.max()*0.6,255,cv.THRESH_BINARY)