OpenCV与图像处理学习十一——分水岭算法(含代码)

  • 一、分水岭算法概要
  • 二、分水岭算法步骤
  • 三、代码应用

一、分水岭算法概要

任意的灰度图像可以被看做是地质学表面,高亮度的地方是山峰,低亮度的地方是山谷。

给每个孤立的山谷(局部最小值)不同颜色的水(标签),当水涨起来,根据周围的山峰(梯度),不同的山谷也就是不同的颜色会开始合并,要避免山谷合并,需要在水要合并的地方建立分水岭,直到所有山峰都被淹没,所创建的分水岭就是分割边界线,这个就是分水岭的原理。

二、分水岭算法步骤

  1. 将白色背景变成黑色背景——目的是为了后面的变换做准备
  2. 使用filter2D与拉普拉斯算子实现图像对比度的提高
  3. 转为二值图像
  4. 距离变换
  5. 对距离变换结果进行归一化[0-1]之间
  6. 使用阈值,在此二值化,得到标记
  7. 腐蚀每个peak erode
  8. 发现轮廓 findContours
  9. 绘制轮廓 drawContours
  10. 分水岭变换 watershed
  11. 对每个分割区域着色输出结果

三、代码应用

"""
完成分水岭算法步骤:
1、加载原始图像
2、阈值分割,将图像分割为黑白两个部分
3、对图像进行开运算,即先腐蚀在膨胀
4、对开运算的结果再进行 膨胀,得到大部分是背景的区域
5、通过距离变换 Distance Transform 获取前景区域
6、背景区域sure_bg 和前景区域sure_fg相减,得到即有前景又有背景的重合区域
7、连通区域处理
8、最后使用分水岭算法
"""import cv2
import numpy as np# Step1. 加载图像
img = cv2.imread('image/yezi.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Step2.阈值分割,将图像分为黑白两部分
ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
cv2.imshow("thresh", thresh)# Step3. 对图像进行“开运算”,先腐蚀再膨胀
kernel = np.ones((3, 3), np.uint8)
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=2)
cv2.imshow("opening", opening)# Step4. 对“开运算”的结果进行膨胀,得到大部分都是背景的区域
sure_bg = cv2.dilate(opening, kernel, iterations=3)
cv2.imshow("sure_bg", sure_bg)# Step5.通过distanceTransform获取前景区域
dist_transform = cv2.distanceTransform(opening, cv2.DIST_L2, 5)  # DIST_L1 DIST_C只能 对应掩膜为3    DIST_L2 可以为3或者5
ret, sure_fg = cv2.threshold(dist_transform, 0.1 * dist_transform.max(), 255, 0)cv2.imshow("sure_fg", sure_fg)# Step6. sure_bg与sure_fg相减,得到既有前景又有背景的重合区域   #此区域和轮廓区域的关系未知
sure_fg = np.uint8(sure_fg)
unknow = cv2.subtract(sure_bg, sure_fg)
cv2.imshow("unknow", unknow)# Step7. 连通区域处理
ret, markers = cv2.connectedComponents(sure_fg, connectivity=8)     # 对连通区域进行标号  序号为 0 - N-1
markers = markers + 1           # OpenCV 分水岭算法对物体做的标注必须都 大于1 ,背景为标号 为0  因此对所有markers 加1  变成了  1  -  N
# 去掉属于背景区域的部分(即让其变为0,成为背景)
# 此语句的Python语法 类似于if ,“unknow==255” 返回的是图像矩阵的真值表。
markers[unknow==255] = 0# Step8.分水岭算法
markers = cv2.watershed(img, markers)  # 分水岭算法后,所有轮廓的像素点被标注为  -1
print(markers)img[markers == -1] = [0, 0, 255]   # 标注为-1 的像素点标 红
cv2.imshow("dst", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

原图为:

使用大津阈值法二值化后的结果:

开运算消除一些噪声(本例不明显):

做膨胀操作,那么得到的背景区域一定是背景区域:

做距离变换操作(或腐蚀),那么得到的前景一定为真正的前景:

中间是既有前景又有背景的重合区域,此区域和轮廓区域的关系未知:

分水岭算法之后的效果为:

OpenCV与图像处理学习十一——分水岭算法(含代码)相关推荐

  1. OpenCV与图像处理学习十——区域生长算法(含代码)

    OpenCV与图像处理学习十--区域生长算法(含代码) 一.区域生长算法概要 二.区域生长算法原理 三.代码应用 一.区域生长算法概要 区域生长是一种串行区域分割的图像分割方法.区域生长是指从某个像素 ...

  2. OpenCV与图像处理学习九——连通区域分析算法(含代码)

    OpenCV与图像处理学习九--连通区域分析算法(含代码) 一.连通区域概要 二.Two-Pass算法 三.代码实现 一.连通区域概要 连通区域(Connected Component)一般是指图像中 ...

  3. OpenCV与图像处理学习十七——OpenCV人脸检测(含代码)

    OpenCV与图像处理学习十七--OpenCV人脸检测(含代码) 一.人脸识别概要 1.1 人脸检测 1.2 人脸对齐(Face Alignment) 1.3 人脸特征提取(Face Feature ...

  4. OpenCV与图像处理学习十四——SIFT特征(含代码)

    OpenCV与图像处理学习十四--SIFT特征(含代码) 一.SIFT算法 二.SIFT实现过程 三.代码实现 一.SIFT算法 SIFT, 即尺度不变特征变换算法(Scale-invariant f ...

  5. OpenCV与图像处理学习十五——LBP纹理特征(含代码)

    OpenCV与图像处理学习十五--LBP纹理特征(含代码) 一.LBP介绍 二.LBP原理 三.代码应用 一.LBP介绍 LBP(Local Binary Pattern, 局部二值模式) , 是一种 ...

  6. OpenCV与图像处理学习十三——Harris角点检测(含代码)

    OpenCV与图像处理学习十三--Harris角点检测(含代码) 一.角点的概念 二.Harris角点检测的实现过程 三.Harris代码应用 一.角点的概念 角点: 在现实世界中, 角点对应于物体的 ...

  7. OpenCV与图像处理学习八——图像边缘提取(Canny检测代码)

    OpenCV与图像处理学习八--图像边缘提取(Canny检测代码) 一.图像梯度 1.1 梯度 1.2 图像梯度 二.梯度图与梯度算子 2.1模板卷积 2.2 梯度图 2.3 梯度算子 2.3.1 R ...

  8. OpenCV与图像处理学习六——图像形态学操作:腐蚀、膨胀、开、闭运算、形态学梯度、顶帽和黑帽

    OpenCV与图像处理学习六--图像形态学操作:腐蚀.膨胀.开.闭运算.形态学梯度.顶帽和黑帽 四.图像形态学操作 4.1 腐蚀和膨胀 4.1.1 图像腐蚀 4.1.2 图像膨胀 4.2 开运算与闭运 ...

  9. OpenCV数字图像处理学习平台

    原始图像1-1 处理中的图像1-2 处理结果1-3(检测到所有圆) OpenCV数字图像处理学习平台,是一款可视化.交互式方式学习OpenCV的工具软件,由资深计算机视觉专家精心打造,花费近两年整理成 ...

最新文章

  1. 实现线程哪种方法更好_实施数据以实现更好的用户体验设计的4种方法
  2. mysql memcached 使用场景_memcache的应用场景?
  3. python入门学习[看漫画学Python:有趣、有料、好玩、好用读书笔记]
  4. 机器学习实战(MachineLearinginAction) 第一章
  5. ondestroy什么时候调用_JavaScript基础——你真的清楚JavaScript是什么吗?
  6. HTML5的表单验证属性--pattern
  7. 新手如何入门PyTorch
  8. nacos动态配置数据源_Sentinel使用Nacos存储规则及同步
  9. 开源爬虫框架各有什么优缺点?
  10. PHP站长工具箱网站源码下载,在线小工具网站源码,独立后台管理,可自主添加工具
  11. C语言入门检验身份证号码最后一位
  12. 大数据工程师面临哪些行业机遇与挑战?
  13. 盘符修改后,node重装一顿操作猛如虎
  14. tomcat如何增大并发_tomcat最大并发连接数的修改方法
  15. Windows server 2012 远程桌面被系统自动关闭
  16. 测试工作3年还在基础岗?可能只是因为你的工作能力差
  17. 如何配置系统数据库服务器地址,如何配置系统数据库服务器地址
  18. 使用fiddler抓取HTTPS协议数据与疑难杂症终极解决方案
  19. 贵州学业水平计算机考试真题,贵州省2017年7月普通高中学业水平考试数学试卷(真题卷附全解析)...
  20. wireshark 抓 蓝牙数据_利用nRF Sniffer对蓝牙BLE通信数据进行嗅探和分析

热门文章

  1. ad批量走线_AD PCB直角布线批量改为圆角,怎么批量修改呢?
  2. 实时数据产品实践——美团大交通战场沙盘
  3. 参会邀请 - ISWC2020 | 第十九届国际语义网会议
  4. 斯坦福完全可解释深度神经网络:你需要用决策树搞点事
  5. 企业战略咨询方法:学习SWOT分析
  6. 【LeetCode】3月28日打卡-Day13
  7. 给VBox中的linux添加虚拟硬盘(扩容)
  8. BZOJ 1305 二分+网络流
  9. python 3 关于requests库的 text / content /json
  10. 开启log4net内部调试