分水岭 代码

 1 # Author:Winter Liu is coming!
 2 import cv2 as cv
 3 import numpy as np
 4 
 5 
 6 def watershed_demo(image):
 7     # 偏移均值滤波
 8     blur = cv.pyrMeanShiftFiltering(image, 10, 100)
 9     # 转换为灰度图像
10     gray = cv.cvtColor(blur, cv.COLOR_BGR2GRAY)
11     # 二值化,注意 THRESH_BINARY_INV(背景白色) 和 THRESH_BINARY(背景黑色)
12     ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU)
13     # 构造矩形结构元素
14     kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3))
15     # 两次 开操作(先腐蚀,再膨胀) 消除噪点
16     mb = cv.morphologyEx(binary, cv.MORPH_OPEN, kernel, iterations=2)
17     # 膨胀3次 放大需要的区域
18     sure_bg = cv.dilate(mb, kernel, iterations=3)
19     cv.imshow("sure_bg", sure_bg)
20     # 距离变换,目标白色255,背景黑色0,像素点距离背景越远,距离越大,使用距离值替代像素值
21     dist = cv.distanceTransform(mb, cv.DIST_L2, 5)
22     print(dist.dtype)
23 
24     # distanceTransform()返回的图像数据是浮点数,显示时大于1的都会按照白色1.0处理
25     cv.imshow("dist", dist)
26     # 对图像进行归一化处理
27     dist_output = cv.normalize(dist, 0, 1.0, cv.NORM_MINMAX)
28     # 放大像素点值,避免值过小无法显示效果
29     cv.imshow("dist-t", dist_output*60)
30 
31     ret, sure_fg = cv.threshold(dist, dist.max()*0.6, 255, cv.THRESH_BINARY)
32     cv.imshow("sure-fg", sure_fg)
33 
34     surface_fg = np.uint8(sure_fg)
35     unknown = cv.subtract(sure_bg, surface_fg)
36     cv.imshow("unknown", unknown)
37     # ret种子数,从种子开始向外涨水
38     # markers:与原图像大小相同,数据类型为 int32 的数组,包含原图像的确认区域的数据
39     ret, markers = cv.connectedComponents(surface_fg)
40     print(ret)
41     # 确定分类的区域使用不同的正整数标记,unknown区域使用 0 标记
42     # connectedComponents()会在标签中 将背景标为 0,
43     # 其他的使用从 1 开始的正整数标记(其实这就是我们的种子,水漫时会从这里漫出)
44     # 如果背景标记为 0,为了区分未知区域,将背景区域+1
45     markers += 1
46     markers[unknown == 255] = 0
47     # 开始漫水
48     markers = cv.watershed(image, markers)
49     image[markers == -1] = [0, 0, 255]
50     cv.imshow("result", image)
51 
52 
53 src = cv.imread(r"C:\PycharmProjects\OpenCV\pic\coins.jpg")
54 cv.imshow("original_pic", src)
55 watershed_demo(src)
56 cv.waitKey(0)
57 cv.destroyAllWindows()

猜你喜欢

转载自www.cnblogs.com/nmucomputer/p/12206751.html