opencv-分水岭算法分割

原理
任何一副灰度图像都可以被看成拓扑平面,灰度值高的区域可以被看成是山峰,灰度值低的区域可以被看成是山谷。我们向每一个山谷中灌不同颜色的水。随着水的位的升高,不同山谷的水就会相遇汇合,为了防止不同山谷的水汇合,我们需要在水汇合的地方构建起堤坝。不停的灌水,不停的构建堤坝知道所有的山峰都被水淹没。我们构建好的堤坝就是对图像的分割。这就是分水岭算法的背后哲理。
分水岭算法是一种图像分割算法,常用于分割具有重叠目标的图像。它基于数学形态学的理念,将图像看作地形图,水流在图像的低谷(目标边界)聚集,形成分割线。OpenCV 提供了 cv2.watershed() 函数来执行分水岭算法。

基本的语法如下:

cv2.watershed(image, markers)

参数说明:

  • image: 输入的图像,通常是一个三通道彩色图像。
  • markers: 标记图像,用于指定分水岭算法的初始标记。标记图像应该是单通道灰度图像,其中不同的标记值表示不同的区域。

cv2.watershed 函数会修改输入图像,将标记图像中的区域分割开,并用不同的颜色标记不同的分割区域。分水岭算法通常用于从预先标记的图像中分割出目标区域。

以下是一个简单的示例,演示如何使用分水岭算法进行图像分割:

import cv2
import numpy as np
import matplotlib.pyplot as plt# 读取图像
img = cv2.imread(r"C:\Users\mzd\Desktop\opencv\4.jpg")
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)# 转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 使用阈值分割获取前景区域掩码
_, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
#cv2.threshold 是 OpenCV 中用于图像阈值化的函数。阈值化是一种将图像分割成两个区域的方法,通常用于目标检测、边缘检测等应用。
# 对前景区域进行形态学操作,消除小的噪点
kernel = np.ones((3, 3), np.uint8)
#np.ones 是 NumPy 中的一个函数,用于创建一个指定形状(shape)的数组,并将数组的所有元素初始化为 1
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=2)# 通过距离变换获取图像的距离变换结果
dist_transform = cv2.distanceTransform(opening, cv2.DIST_L2, 5)
_, sure_fg = cv2.threshold(dist_transform, 0.7 * dist_transform.max(), 255, 0)# 获取背景区域掩码
sure_bg = cv2.dilate(opening, kernel, iterations=3)# 标记不确定的区域
sure_fg = np.uint8(sure_fg)
unknown = cv2.subtract(sure_bg, sure_fg)# 使用连通组件标记不确定区域
_, markers = cv2.connectedComponents(sure_fg)# 将标记+1作为不确定区域的标记,以避免与已知区域的标记冲突
markers = markers + 1
markers[unknown == 255] = 0  # 不确定区域的标记设为0# 应用分水岭算法
cv2.watershed(img, markers)# 将分水岭算法的标记区域设为红色
img[markers == -1] = [255, 0, 0]# 显示原始图像、阈值分割结果和分水岭算法结果
plt.figure(figsize=(12, 6))plt.subplot(131), plt.imshow(img_rgb)
plt.title('Original Image'), plt.axis('off')plt.subplot(132), plt.imshow(thresh, cmap='gray')
plt.title('Thresholded Image'), plt.axis('off')plt.subplot(133), plt.imshow(img)
plt.title('Watershed Result'), plt.axis('off')plt.show()

在这里插入图片描述

在这个示例中,我们首先读取了一幅图像,将其转换为灰度图像。然后,使用阈值分割获取前景区域的掩码,并通过形态学操作和距离变换对图像进行预处理。接着,通过分水岭算法将图像分割为不同的区域,并在结果图像上标记分割线。最后,通过 Matplotlib 显示原始图像、阈值分割结果和分水岭算法的分割结果。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智能头盔天眼摄像头、单兵执法记录仪等配合MESH自组网在应急指挥调度中的应用

智能头盔、天眼摄像头、头盔记录仪、头盔摄像头、单兵执法记录仪等配合MESH自组网在应急指挥调度中的应用。 20人背负单兵自组网(带手咪)到训练场,戴头盔,头盔上放头盔式摄像头,大功率自组网设置在制高点,…

Vue-报错No “exports“ main defined in xx

vue报错:No "exports" main defined in F:\wjh\vue#Practice\EasyQuestionnaire-web-master\EasyQuestionnaire-web-master\node_modules\babel\helper-compilation-targets\package.json 1.在文件中找到该路径的package.json文件, 2.按照提示…

Kafka 常用功能总结(不断更新中....)

kafka 用途 业务中我们经常用来两个方面 1.发送消息 2.发送日志记录 kafka 结构组成 broker:可以理解成一个单独的服务器,所有的东西都归属到broker中 partation:为了增加并发度而做的拆分,相当于把broker拆分成不同的小块&…

八股文面试day6

什么是代理?为什么要用动态代理? 代理模式大概意思是:为其他对象提供一个代理项或者是占位符,以控制对这个对象的访问 代理模式核心思想:创建一个代理对象,在客户端和目标对象之间的一个中介,…

mysql 行转列 GROUP_CONCAT 试验

1.概要 很多时候需要用到行专列的方式做数据分析。比如对通讯数据的采集 数据采集结果如下: 变量值采集周期131251132272 我想要看的结果 变量1变量2采集周期351372 就是我想看到相关数据的周期变化情况。 2.试验 2.1创建数据如下(表名 tb5&…

第十七章总结

1.打卡“命令提示符”,用管理员身份运行 2.登录MySQL 3.创建库和表 4.使用Java命令查询数据库操作 5.右击——点击“Build Path”——选择第四个——找到包的位置——导入成功 一、创建java项目 二、连接数据库 2.获取链接 3.获取statment对象 3.获取statment…

9.9 Windows驱动开发:内核远程线程实现DLL注入

在笔者上一篇文章《内核RIP劫持实现DLL注入》介绍了通过劫持RIP指针控制程序执行流实现插入DLL的目的,本章将继续探索全新的注入方式,通过NtCreateThreadEx这个内核函数实现注入DLL的目的,需要注意的是该函数在微软系统中未被导出使用时需要首…

UniApp打包教程:使用HBuilder X和AppUploader完成原生App云打包和上架指南“

目录 uniapp进行打包 使用上架工具appuplode进行发包 1.登录appuploder软件 2.登陆开发者App Store后台 uniapp进行打包 在HBuilder X编辑器中打开需要打包的项目,然后点击上面菜单栏中 发行 > 原生App-云打包,对以下弹出的弹窗进行内容填写 填写完…

【每日一题】1410. HTML实体解析器-2023.11.23

题目: 1410. HTML 实体解析器 「HTML 实体解析器」 是一种特殊的解析器,它将 HTML 代码作为输入,并用字符本身替换掉所有这些特殊的字符实体。 HTML 里这些特殊字符和它们对应的字符实体包括: 双引号:字符实体为 &…

类加载过程

Java类加载过程包括加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)五个阶段。这些阶段是按照顺序逐步执…

CVE-2023-27524:Apache Superset未授权访问漏洞复现

文章目录 ​Apache Superset 未授权访问漏洞(CVE-2023-27524)复现0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.漏洞复现 0x06 修复建议 ​Apache Superset 未授权访问漏洞(CVE-2023-27524)复现 0x01 前言 免责声明:请勿利用文…