图像分割 - 分水岭算法

news2024/11/16 3:15:14

目录

1. 介绍

2.  分水岭算法的实现

距离变换

连接连通分量

3. 代码


1. 介绍

图像是由x,y表示的,如果将灰度值也考虑进去的话,那么一幅图像需要一个三维的空间去表示。

这样就可以把x,y轴比作大地,将灰度值的z轴比作地面上的坡度。

因为图像的灰度值是不均匀的,那么也意味着这个地面也是坑坑洼洼的。那么试想一下,下雨的时候,由于地面是不平坦的,雨水会顺着高的地面流向地处。必然会导致有的地方堆满了水,有的地方由于地势较陡,没有雨水

分水岭算法就是利用这种“地形学”,或者说灰度值的不均匀对图像进行分割。 

在这种将图像类比成地形的方法里,主要考虑三种点:

  • 属于区域极小值的点
  • 水滴所在位置的点,如果把水滴放在任意位置,水滴必然流向某个极小值
  • 水等概率的流向不止一个极小值的点

在这里,如果某个区域是极小值,且满足第二个条件的点集称为汇水盆地或者分水岭

满足第三个条件的点形成地形表面的线,称为分界线

分水岭算法实现的思路是:

找到一些初始点,然后对这些点集进行灌水。随着水位的上升,不同区域的水会开始融合。为了阻止这种现象,在这些融合处建立拦水坝,这样拦水坝就把图像进行了分割

初始点的选择需要用到距离变换

2.  分水岭算法的实现

首先尝试对下面的算法进行分水岭算法的分割

 


这里读取的是彩色图像,因为最后的 watershed 函数需要传入彩色图像

这里对图像进行阈值处理的结果为

 


阈值处理发现,这里硬币内部出现了孔洞,在背景上也出现了白色的噪声点

因为开运算可以消除白色的噪声,而闭运算可以消除内部的孔洞,所以这里采用形态学的方法进行处理。具体的可以参考:灰度级形态学 - 灰度开运算和灰度闭运算

 


接下来,通过膨胀,将前景扩大,这样就可以确定哪些是背景,哪些是前景

 

这一步主要为了确定真正的前景区域


距离变换

接下来,通过距离变换可以找到这些硬币近似的中心点。先展示下效果,在做讲解

 

因为数据类型的原因,这种用 matplotlib 展示。这里距离变换会计算前景像素点到周围最近背景像素点的距离,所以这里像素点越亮,距离背景越远。并且输入图像必须是个二值图像

 


然后,获取距离变换中距离背景远处的点,这些点就是我们分水岭算法的初始点

因为现在的前景区域一定是硬币的位置

 


unknown 是不确定区域,或者说,这里是有分线线的地方

 


连接连通分量

它会把将背景标记为 0,其他的对象使用从 1 开始的正整数标记

 

这样,分水岭算法会从每个标记的位置开始注水,除了0未知区域。这样水位升高的时候,不同区域的水就会在未知区域相遇,这样分界线就被找出来了

 

 


分水岭算法会将不同区域之间的边界设置为 -1

watershed的结果中只有-1,0,1,2这样的数

 分水岭算法的结果:

 分割的结果:

 

3. 代码

import cv2
import numpy as np
import matplotlib.pyplot as plt

src = cv2.imread('./img.png')                       # 彩色图像

img = src.copy()
img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)          # 转为灰度图像

ret, img_bin = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)   # 阈值处理

kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))                            # 获取结构元
img_close = cv2.morphologyEx(img_bin, cv2.MORPH_CLOSE, kernel, iterations=3)        # 闭运算填充内部的孔洞
img_open = cv2.morphologyEx(img_close, cv2.MORPH_OPEN, kernel, iterations=2)        # 开运算消除白色噪声

img_bin = cv2.dilate(img_open, kernel, iterations=2)                                # 膨胀确定前景和背景
dist_transform = cv2.distanceTransform(img_bin, cv2.DIST_L2, 5)                     # 距离变换

ret, img_seed = cv2.threshold(dist_transform, 0.7 * dist_transform.max(), 255, cv2.THRESH_BINARY)   # 获取距离背景最远的点
img_seed = np.uint8(img_seed)       # 转为图像的形式

unknown = cv2.subtract(img_bin,img_seed)                # 可能是背景,可能是前景

ret, markers = cv2.connectedComponents(img_seed)       # 连接连通分量
markers = markers + 1                                  # 确保背景是1不是0
markers[unknown == 255] = 0                            # 未知区域标记为0

markers = cv2.watershed(src, markers)                 # 分水岭算法
src[markers == -1] = [255,0,0]                        # 将边界找出


plt.imshow(np.abs(markers),cmap = 'jet')                # 分水岭算法结果
plt.show()

cv2.imshow('img',src)                                   # 分割结果
cv2.waitKey()
cv2.destroyAllWindows()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/31724.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

产品流程图设计

一个产品设计之初,必先从流程图做起,流程图可以用来表达产品各式各样的流程,好的流程图,可以快速让整个团队熟悉理解业务,并优化业务。 一、常用的流程图图标含义 流程图通常由起止框、处理框、流程线、判断框、输出输…

使用HTML制作静态网站 中国传统文化 丝绸之路 (学生网页设计作业源码)

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

HummerRisk V0.5.2:升级对象存储、云检测、云审计和K8s资源态势等

HummerRisk V0.5.2发布:对象存储增加风险检测和操作、云检测支持七牛云、操作审计支持 AWS,提升 K8s 资源态势,并支持在线/离线升级漏洞库。 感谢社区中小伙伴们的反馈,你们的认可是我们前进的动力。 HummerRisk 保持高速的迭代…

Web App、Hybrid App、Native App 横向对比

移动端的开发方式三分天下:纯原生(Native App)、混合开发(Hybird App)、网页应用(Web App)。 纯原生(Native App):是在 Android、iOS 等移动平台上利用提供的…

2023第三届中国数字化人才国际峰会

会议背景 中商产业研究院预测,2022年我国数字经济规模将增至48.9万亿元,数字经济在GDP中的比重将超过40%。随着中国经济数字化转型不断深入的同时,数字化人才缺口却近1100万。中国信息通信研究院发布的《数字经济就业影响研究报告》指出&…

数学统计:均值、标准差、方差、协方差

均值:均值描述的是样本集合的中间点,它告诉我们的信息是很有限的。 标准差:标准差给我们描述的则是样本集合的各个样本点到均值的距离之平均。以这两个集合为例,[0,8,12,20]和[8,9,11,12],两个集合的均值都是10,但显然两个集合差别是很大的,计算两者的标准差,前…

蓝牙运动耳机什么品牌性价比高,六款值得推荐的运动耳机分享

音乐是运动健身的伴侣,两者合在一起就能让运动变得更加有劲。运动耳机怎么选,想要找到一款不错的运动耳机,首先一定要牢固舒适,其次防水性能越高越好,最后音质偏低音,如果在户外跑步的话,放着大…

Android App开发网络通信中使用okhttp下载和上传图片、文件讲解及实战(超详细实现用户注册信息上传 附源码)

需要源码请点赞关注收藏后评论区留言并且私信~~~ 一、使用okhttp下载图片 okhttp不但简化了HTTP接口的调用过程,连下载文件都变得简单了,对于一般的文件下载,按照常规的GET方式调用流程,只要重写回调方法onResponse,在…

C++:指针:void*指针(跳跃力未定的指针)

先分享一段代码&#xff0c;觉得很有意思 #include<iostream> void* say_hello(void* args){std::cout<< "Hello world"<< std::endl;return 0; } 上面这段代码&#xff0c;我们看到函数的返回值类型竟然是 void* ,形参也是 void* &#xff0c…

限时开源,一份“扭转乾坤”的与时俱进的1700页Java八股文

今天在某客看到一个程序员自述&#xff0c;内容如下&#xff1a; 人到三十&#xff0c;公司效益不好被裁员&#xff0c;两个月时间面了三十几家&#xff0c;一直不是很顺利&#xff0c;面试问八股&#xff0c;根本答不上来。前期不信邪&#xff0c;正常投简历正常面试&#xf…

如何借助现有股票量化交易平台编写策略和回测分析

每个交易日的股票都会上涨或者下跌&#xff0c;在这个过程中笔者们偶尔会想针对部分股票进行股价的涨跌幅进行监控&#xff0c;或者自动进行交易&#xff0c;在这个需求前提下&#xff0c;现有券商、股票分析软件都会带有机器人自动交易策略功能&#xff0c;大部分都需要收费或…

web网页大作业——基于HTML+CSS+JavaScript制作摄影之家网站

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

OAuth2 的授权流程

文章目录&#x1f4d6; OAuth2 的授权流程&#x1f4d1; 参与的角色&#x1f4d1; 授权流程&#x1f4d1; 授权许可 Authorization Grant&#x1f4d1; 直白话 OAuth2 流程&#x1f4d6; OAuth2 的授权流程 &#x1f4d1; 参与的角色 1️⃣ Resource Owner资源所有者&#xf…

如何监听电脑屏幕是否发生切换

目录 1.屏幕监听的原理&#xff1a; 2.创建项目 3.离开计时 1.屏幕监听的原理&#xff1a; 为什么可以监听浏览器窗口的切换呢&#xff1f;那就是利用了浏览器的visibilitychange属性&#xff0c;MDN的介绍对visibilitychnge的介绍是&#xff1a; 当其选项卡的内容变得可见或…

nginx(六十二)proxy模块(三)接收用户请求的包体

一 接收用户请求包体 nginx读取请求体的源码分析 说明&#xff1a; 虽然是被http core核心框架处理,但是被proxy反向代理模块使用重点&#xff1a; 哪些指令控制接收request body的行为? ① proxy_request_buffering 控制&#xff1a; nginx接收客户端 request body的方式…

【优化选址】遗传算法求解物流配送中心选址【含Matlab源码 1917期】

⛄一、物流选址简介 1 引言 配送中心是物流系统网络中的关键节点和重要的基础设施&#xff0c;在整个物流系统网络规划中起着枢纽性的作用[1]。快递物流配送中心选址是指在具有若干个发件网点或者若干个收件网点的物流配送区域内&#xff0c;综合考虑物流运输成本、配送中心建…

【计算机网络】Servlet API重点知识汇总

目录 1.HttpServlet&#xff1a; 2.HttpServletRequest&#xff1a; 3.HttpServletRequest代码实例&#xff1a; 3.1.打印请求的内容&#xff1a; 3.2.获取请求中的重要参数 &#xff08;query string中的值&#xff09;&#xff1a; 3.3.获取请求中的重要参数 &#x…

关于循环浅析

从c,c,python,scala到java&#xff0c;简单接触了这样一些编程语言&#xff0c;对于它们的基本语法中的循环想做个总结。 一、c&#xff0c;c C语言for循环&#xff08;for语句&#xff09;详解 (biancheng.net) //这个链接比较详细&#xff0c;本人也从中摘取了一些知识点。…

【javaEE】网络原理(传输层Part2)

努力经营当下&#xff0c;直至未来明朗&#xff01; 文章目录前言TCP相关机制4. 【滑动窗口】5.【流量控制】6.【拥塞控制】总结前言 一个人最大的痛苦来源于对自己无能的愤怒&#xff01; Hi&#xff0c;这里是不想秃头的宝贝儿&#xff01; 本文主要内容是 传输层中TCP相关…

什么是SRM,SRM有什么作用,SRM主要用途是什么?

简道云SRM管理应用一、什么是SRM? SRM是 Supplier Relationship Management 的英文缩写&#xff0c;即供应商关系管理。 SRM的最基本内容包括供应商分类选择、战略关系发展、供应商谈判和供应商绩效评价四个方面。 SRM是用来改善企业与供应商的关系&#xff0c;它是一种致力…