python_分水岭算法
def img_huizhi_lunkuo_tongji():"""识别小物体数量:return:"""def watershed_algorithm(image):src = image.copy()blur = cv2.pyrMeanShiftFiltering(image, sp=21, sr=55) # 边缘保留滤波 去噪cv2.imshow("灰度", blur)gray = cv2.cvtColor(blur, cv2.COLOR_BGR2GRAY)# 转成灰度图像ret, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)# 得到二值图像区间阈值cv2.imshow('二值图像thres', binary)# 距离变换dist = cv2.distanceTransform(binary, cv2.DIST_L2, 3) #反映像素与背景(值为 0的像素点)的距离关系#uint8类型的图片归一化处理dist_out = cv2.normalize(dist, 0, 1.0, cv2.NORM_MINMAX)cv2.imshow('距离转换distance-Transform', dist_out * 100)#再次进行阈值转换ret, surface = cv2.threshold(dist_out, 0.5 * dist_out.max(), 255, cv2.THRESH_BINARY)cv2.imshow('前景图', surface)sure_fg = np.uint8(surface) # 转成8位整型cv2.imshow('背景图Sure foreground', sure_fg)# image = np.hstack((gray, sure_fg))#水平合并显示# cv2.imshow('hstack', image)# Marker labellingret, markers = cv2.connectedComponents(sure_fg) # 连通区域print(ret)markers = markers + 1 # 整个图+1 确保背景是1不是0# 未知区域标记(不能确定是前景还是背景)kernel = np.ones((3, 3), np.uint8)#内核#类形态学的变化op=cv2.MORPH_DILATE # op = cv2.MORPH_OPENbinary = cv2.morphologyEx(binary, op, kernel, iterations=1)#腐蚀一次# cv2.MORPH_OPEN 开运算--先腐蚀--膨胀,分开# cv2.MORPH_CLOSE 闭运算--膨胀-腐蚀--合并# MORPH_GRADIENT - 形态学梯度(Morphological gradient)就是膨胀图与俯视图之差,用于保留物体的边缘轮廓# MORPH_TOPHAT - 顶帽(Top hat) 原图像与开运算图之差,用于分离比邻近点亮一些的斑块。# MORPH_BLACKHAT - 黑帽(Black hat) 闭运算与原图像之差,用于分离比邻近点暗一些的斑块。# MORPH_ERODE 腐蚀,去毛刺# MORPH_DILATE 膨胀,去小孔# 形状:表核的形状,矩形MORPH_RECT; 交叉形MORPH_CROSS; 椭圆形MORPH_ELLIPSE;unknown = binary - sure_fg # #腐蚀-背景cv2.imshow('unknown', unknown)markers[unknown == 255] = 0 #未标记区域markers_show = np.uint8(markers)## 区域标记结果转换cv2.imshow('markers', markers_show * 100)# 分水岭算法分割markers = cv2.watershed(image, markers=markers) # 标签图像将会被修改,边界区域的标记将变为 -1# src[markers == -1] = [0, 0, 255] # 红色# 获得到的边界值为-1min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(markers)markers_8u = np.uint8(markers)# print(max_val)colors = [(255, 0, 0), (0, 255, 0), (0, 0, 255), (255, 255, 0),(255, 0, 255), (0, 255, 255), (255, 128, 0), (255, 0, 128),(128, 255, 0), (128, 0, 255), (255, 128, 128), (128, 255, 255)]for i in range(2, int(max_val + 1)):ret, thres1 = cv2.threshold(markers_8u, i - 1, 255, cv2.THRESH_BINARY)ret2, thres2 = cv2.threshold(markers_8u, i, 255, cv2.THRESH_BINARY)mask = thres1 - thres2cv2.imshow('mask', mask)# color = (rd.randint(0,255), rd.randint(0,255), rd.randint(0,255))# image[markers == i] = [rd.randint(0,255), rd.randint(0,255), rd.randint(0,255)]# image[markers == i] = [colors[i-2]]contours, hierarchy = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)cv2.drawContours(image, contours, -1, colors[(i - 2) % 12], -1)# cv2.drawContours(src,contours,-1,colors[(i-2)%12],-1)M = cv2.moments(contours[0])cx = int(M['m10'] / M['m00'])cy = int(M['m01'] / M['m00']) # 轮廓重心cv2.drawMarker(image, (cx, cy), (0, 0, 255), 1, 10, 2)cv2.drawMarker(src, (cx, cy), (0, 0, 255), 1, 10, 2)cv2.putText(src, "count=%d" % (int(max_val - 1)), (220, 30), 0, 1, (0, 255, 0), 2)cv2.putText(image, "count=%d" % (int(max_val - 1)), (220, 30), 0, 1, (0, 255, 0), 2)cv2.imshow('regions', image)result = cv2.addWeighted(src, 0.6, image, 0.5, 0) # 图像权重叠加cv2.imshow('result', result)src = cv2.imread('./douzi.bmp')# src = cv2.imread('./99.bmp')cv2.imshow('src', src)watershed_algorithm(src)cv2.waitKey(0)cv2.destroyAllWindows()
python_分水岭算法相关推荐
- 《OpenCV3编程入门》学习笔记8 图像轮廓与图像分割修复(五)分水岭算法(watershed algorithm)
8.5 分水岭算法(watershed algorithm) 1.基于拓扑理论的数学形态学的分割方法. 2.基本思想:把图像看作测地学上的拓扑地貌,图像中每一点像素的灰度值表示该点的海拔高度,每一个局 ...
- OpenCV+python:分水岭算法
1,概念简介 现实中我们可以或者说可以想象有山有湖的景象,那么那一定是水绕 山,山围水的情形.当然在需要的时候,要人工构筑分水岭,以防集水盆之间的互相穿透.而区分高山(plateaus)与水的界线,以 ...
- Python OpenCV分水岭算法分割和提取重叠或有衔接的图像中的对象
本文将介绍如何使用分水岭算法对触摸和重叠的图像中的对象进行分割和提取. 参考:https://www.pyimagesearch.com/2015/11/02/watershed-opencv/ 分水 ...
- OpenCV(26)图像分割 -- 距离变换与分水岭算法(硬币检测、扑克牌检测、车道检测)
目录 一.基础理论 1.思想 2.原理 二.分水岭实战:硬币 步骤归纳 1.把原图像转二值图 2.开运算去噪 3.确定背景区域(膨胀)(得到背景/最大连通域) 4.确定前景区域(距离变换) (分离)( ...
- OpenCV 【四】————Watershed Algorithm(图像分割)——分水岭算法的原理及实现
分水岭算法实现(C++.opencv) 1.作用: 通常用于分割图像,主要实现以临近像素间的相似性作为重要的参考依据,从而将在空间位置上相近并且灰度值相近的像素点互相连接起来构成一个封闭的轮廓,封闭性 ...
- 什么是标记符控制的分水岭算法
本文首先指出传统分水岭算法的不足,然后介绍了标记符控制的分水岭算法,最后通过实例演示了该算法在图像分割中的应用.该微信图文由安晟提供.
- 图像轮廓、凸包、图像的矩、分水岭算法、图像修补
文章目录 1.查找并绘制轮廓 1.1 寻找轮廓:findContours() 函数 1.2 绘制轮廓:drawContours() 函数 1.3 示例程序:轮廓查找 1.4 综合示例:查找并绘制轮廓 ...
- OpenCV | 分水岭算法进行图像分割
分水岭算法进行图像分割 分水岭分割方法,是一种基于拓扑理论的数学形态学的分割方法,其基本思想是把图像看作是测地学上的拓扑地貌,图像中每一点像素的灰度值表示该点的海拔高度,每一个局部极小值及其影响区域称 ...
- python图像分割算法_Opencv(二)—图像分割之分水岭算法!
做图像处理时,我们可能会遇到一个问题:我们只需要图片的一部分区域,如何把图片中的某部分区域提取出来 或者 图像想要的区域用某种颜色(与其它区域颜色不一致)标记起来 ,以上描述的问题在像处理领域称为 图 ...
最新文章
- UIView旋转角度
- C#把TextBox.Text的几万条数据按数据格式导出Excel报错:Insufficient memory to continue the execution of the program.
- 使用Chrome工具来分析页面的绘制状态
- Python的setuptools详解【2】find_packages()
- java jpopupmenu 无法显示_java – 从JButton显示/隐藏JPopupMenu; FocusListener无法正常工作?...
- 使用ulimit设置文件最大打开数
- CSRF Failed: CSRF token missing or incorrect.
- JavaScript(JS)中与正则表达式有关的方法介绍
- 腾讯或于本周正式宣布合并搜狗?官方回应:看点招聘及搜狗合并均正常进行...
- ppt录制宏_Word中录制宏,学会后成大神
- Mysql中把varchar类型的字段转化为tinyint类型的字段
- HTML image button
- 懂商业的技术合伙人(7):怎样快速开发一个APP(2)
- 解决u盘启动盘写保护,无法格式化
- php书店网站模板源代码_网上书店整套html模板
- 2021年度最全“Java面试宝典+Java核心知识集”,一箭双雕杠春招
- linux下仿真流体计算软件,【流体】| 10个目前流行的CFD仿真软件,你了解几个?...
- nsis出错_NSIS错误(NSIS Error)的原因和解决方法总结
- 【蓝桥杯单片机组模块】13、NEC 红外通信 - vs1838B
- 决策树CART 代价复杂度剪枝