分水岭 代码
Posted nmucomputer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分水岭 代码相关的知识,希望对你有一定的参考价值。
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:PycharmProjectsOpenCVpiccoins.jpg") 54 cv.imshow("original_pic", src) 55 watershed_demo(src) 56 cv.waitKey(0) 57 cv.destroyAllWindows()
以上是关于分水岭 代码的主要内容,如果未能解决你的问题,请参考以下文章
MATLAB应用实战系列( 七十五) -图像处理应用 MATLAB实现基于分水岭算法的图像分割 (附matlab代码)
MATLAB应用实战系列( 七十五) -图像处理应用 MATLAB实现基于分水岭算法的图像分割 (附matlab代码)