使用分水岭算法进行图像分割

news2024/10/7 8:20:01

文章目录

    • 理论
    • 代码

原文路径:opencv-4.6.0\doc\py_tutorials\py_imgproc\py_watershed
目标


在这一章当中,

  • 我们将学习使用分水岭算法使用基于标记的图像分割
  • 我们将看到:cv.watershed()

理论

任何灰度图像都可以被视为地形表面,其中高强度表示峰和丘陵,而低强度表示山谷。 您开始用不同颜色的水(标签)填充每个孤立的山谷(局部最小值)。 随着水的上升,根据附近的山峰(梯度),来自不同山谷的水,显然具有不同的颜色,将开始融合。 为了避免这种情况,您可以在水汇合的地方建造障碍物。 你继续填水和建造障碍物,直到所有山峰都被水淹没。 然后,您创建的障碍将为您提供分割结果。 这就是分水岭背后的“哲学”。 您可以访问关于分水岭的CMM网页通过一些动画来理解它。

但由于图像中的噪声或任何其他不规则性,这种方法会给您带来过度分割的结果。 因此,OpenCV 实现了一种基于标记的分水岭算法,您可以指定哪些谷点要合并,哪些不合并。 它是一种交互式图像分割。 我们所做的就是为我们所知道的对象赋予不同的标签。 用一种颜色(或强度)标记我们确定是前景或物体的区域,用另一种颜色标记我们确定是背景或非物体的区域,最后标记我们不确定的区域, 用 0 标记它。这是我们的标记。 然后应用分水岭算法。 然后我们的标记将使用我们给出的标签进行更新,并且对象的边界的值为-1。

代码

下面我们将看到一个有关如何使用距离变换和分水岭来分割相互接触的对象的示例。

考虑下面的硬币图像,硬币相互接触。 即使你阈值它,它也会相互接触。

在这里插入图片描述

我们首先找到硬币的大致估计值。 为此,我们可以使用 Otsu 的二值化。

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt

img = cv.imread('coins.png')
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
ret, thresh = cv.threshold(gray,0,255,cv.THRESH_BINARY_INV+cv.THRESH_OTSU)

结果:
在这里插入图片描述

现在我们需要去除图像中的任何小白噪声。 为此,我们可以使用形态学开运算。 为了去除对象中的任何小孔,我们可以使用形态学闭运算。 所以,现在我们可以确定靠近物体中心的区域是前景,远离物体的区域是背景。 我们唯一不确定的区域是硬币的边界区域。

所以我们需要提取我们确定是硬币的区域。 腐蚀去除边界像素。 所以无论剩下什么,我们都可以确定它是硬币。 如果物体不互相接触的话,这就会起作用。 但由于它们彼此接触,另一个不错的选择是找到距离变换并应用适当的阈值。 接下来我们需要找到我们确定不是硬币的区域。 为此,我们扩大了结果。 膨胀将对象边界增加到背景。 这样,我们可以确保结果中背景中的任何区域确实是背景,因为边界区域已被删除。 请参见下图。
在这里插入图片描述

剩下的区域是我们不知道的区域,无论是硬币还是背景。 分水岭算法应该能找到它。 这些区域通常位于前景和背景相遇的硬币边界周围(甚至两个不同的硬币相遇)。 我们称之为边界。 可以通过sure_bg区域减去sure_fg区域得到。

# 消除噪音
kernel = np.ones((3,3),np.uint8)
opening = cv.morphologyEx(thresh,cv.MORPH_OPEN,kernel, iterations = 2)
# 确定背景区域
sure_bg = cv.dilate(opening,kernel,iterations=3)
# 寻找确定的前景区域
dist_transform = cv.distanceTransform(opening,cv.DIST_L2,5)
ret, sure_fg = cv.threshold(dist_transform,0.7*dist_transform.max(),255,0)
# 寻找未知区域
sure_fg = np.uint8(sure_fg)
unknown = cv.subtract(sure_bg,sure_fg)

查看结果。 在阈值图像中,我们得到一些硬币区域,我们确信这些区域是硬币,但它们现在已分离。 (在某些情况下,您可能只对前景分割感兴趣,而不是对分离相互接触的对象感兴趣。在这种情况下,您不需要使用距离变换,只需腐蚀就足够了。腐蚀只是提取某些前景区域的另一种方法,那就是 全部。)
在这里插入图片描述

现在我们可以确定哪些是硬币区域,哪些是背景等等。 因此,我们创建标记(它是一个与原始图像大小相同的数组,但数据类型为 int32)并标记其中的区域。 我们确定知道的区域(无论是前景还是背景)都用任何正整数标记,但是不同的整数,而我们不确定的区域则保留为零。 为此,我们使用 cv.connectedComponents()。 它用 0 标记图像的背景,然后用从 1 开始的整数标记其他对象。

但我们知道,如果背景标记为0,分水岭会将其视为未知区域。 所以我们想用不同的整数来标记它。 相反,我们将用 0 标记由未知定义的未知区域。

# 标记标签
ret, markers = cv.connectedComponents(sure_fg)
# 为所有标签添加 1,确保背景不是 0,而是 1
markers = markers+1
# 现在,用零标记未知区域
markers[unknown==255] = 0

查看 JET 颜色图中显示的结果。 深蓝色区域显示未知区域。 某些硬币的颜色不同,价值也不同。 与未知区域相比,确定背景的剩余区域以浅蓝色显示。
在这里插入图片描述

现在我们的标记已准备就绪。 现在是最后一步,应用分水岭的时候了。 然后标记图像将被修改。 边界区域将标记为-1。

markers = cv.watershed(img,markers)
img[markers == -1] = [255,0,0]

请参阅下面的结果。 对于某些硬币,它们接触的区域被正确分割,而对于某些硬币则不然。

在这里插入图片描述

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

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

相关文章

【面经】单片机

1、单片机IO口工作方式 输入 模拟输入(GPIO_Mode_AIN):关闭施密特触发器,将电压信号传送到片上外设模块,通常用于连接模拟信号源。浮空输入(GPIO_Mode_IN_FLOATING):在浮空输入状态…

element ui 的密码输入框点击显示隐藏密码时,图标随之改变

场景图&#xff1a; 原理&#xff1a; 通过修改el-input框的type属性&#xff0c;来设置显示或者隐藏。从而改变图标地址。 <el-input class"passwordinput" :type"pwdObj.pwdType" ref"pwdInput" placeholder"密码"v-model"…

VScode C/C++环境安装配置

1. 编译器需要从如下网站下载&#xff1a; MinGW-w64 - for 32 and 64 bit Windows - Browse Files at SourceForge.net 2. 切换到file选项&#xff0c;下拉找到对应的文件版本直接下载&#xff1a; 3. 右键解压到当前文件夹如下&#xff1a; 4. 如图所示复制浏览器上的相应的…

Java 8 Lambda 表达式

目录 出现的背景 外部类 代码 运行 内部类 代码 运行 匿名内部类 代码 运行 Lambda 表达式简介 Lambda 表达式的结构 lambda表达式 代码 运行 什么是功能接口&#xff08;Functional interface&#xff09; 代码 接口 实现类 使用方法重写 使用lambda表达…

解决 fatal: Not a git repository (or any of the parent directories): .git 问题

解决方法&#xff1a;在命令行 输入 git init 然后回车就好了

Aware接口作用

介绍 Aware&#xff08;感知&#xff09;接口是一个标记&#xff0c;里面没有任何方法,实际方法定义都是子接口确定&#xff08;相当于定义了一套规则&#xff0c;并建议子接口中应该只有一个无返回值的方法&#xff09;。 我们知道spring已经定义好了很多对象&#xff0c;如…

深入解析R语言的贝叶斯网络模型:构建、优化与预测;INLA下的贝叶斯回归;现代贝叶斯统计学方法;R语言混合效应(多水平/层次/嵌套)

目录 ①基于R语言的贝叶斯网络模型的实践应用 ②R语言贝叶斯方法在生态环境领域中的应用 ③基于R语言贝叶斯进阶:INLA下的贝叶斯回归、生存分析、随机游走、广义可加模型、极端数据的贝叶斯分析 ④基于R语言的现代贝叶斯统计学方法&#xff08;贝叶斯参数估计、贝叶斯回归、…

Python 实现批量文件重命名工具

在现代软件开发中&#xff0c;图形用户界面 (GUI) 工具的创建是一个常见需求。对于那些需要频繁处理文件的任务&#xff0c;拥有一个简便的 GUI 工具尤为重要。在这篇博客中&#xff0c;我们将介绍如何使用 wxPython 创建一个简单的批量文件重命名工具。该工具可以选择一个文件…

AWS EC2 连接 AWS RDS(Mysql)

1 创建RDS数据库 点击创建数据库 引擎选项 模板 设置 连接 2 EC2连接Mysql $ sudo yum list mariadb* Installed Packages mariadb-connector-c.x86_64 3.1.13-1.amzn2023.0.3 amazonl…

Flutter笔记:Widgets Easier组件库-使用隐私守卫

Flutter笔记 Widgets Easier组件库&#xff1a;使用隐私守卫 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https:…

签发免费https证书的方式

目录 http访问和https访问的区别 实现https后有哪些好处&#xff1a; 如何申请、安装部署免费https证书&#xff1a; 在浏览网页时&#xff0c;最常见的是http访问&#xff0c;但是也有一部分网站前缀是https&#xff0c;且浏览器网址栏会出现“安全”字样&#xff0c;或是绿…

【C++】<图形库> EasyX基础使用

文章目录 一、安装EasyX库 二、图形窗口显示 三、基本绘图函数 四、图片显示 五、键盘交互 六、鼠标交互 七、双缓冲区解决闪屏 一、安装EasyX库 已经有兄弟写得很清楚了&#xff0c;见EasyX | 安装教程&#xff08;详细图文&#xff09;。 二、图形窗口显示 1. 包含的…

深度学习之基于Tensorflow+Flask框架Web手写数字识别

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 手写数字识别是深度学习领域中的一个经典问题&#xff0c;也是计算机视觉领域的重要应用之一。…

【加密与解密(第四版)】第二十一章笔记

第二十一章 VMProtect逆向和还原浅析 21.1 VMProtect逆向分析 21.2 VMProtect的还原 不行了&#xff0c;一点都看不懂

centos7和centos8安装mysql5.6 5.7 8.0

https://dev.mysql.com/downloads/repo/yum/ 注意构造下http://repo.mysql.com/mysql-community-release-el*-*.noarch.rpm 【以centos7为例】 安装mysql5.6 wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm rpm -ivh mysql-community-release-el7-5…

推荐网站(17)audiohub免费音乐平台

今天&#xff0c;我要向您推荐一个非常实用的网站——AudioHub。这是一个提供免费音乐的平台&#xff0c;特别适合需要无版权音乐资源的创作者、视频制作人、播客主持人以及任何需要背景音乐的项目。里面的音乐无版权&#xff0c;可商用。 链接直达&#xff1a;https://audiohu…

移动硬盘不显示容量与无法访问问题的解决方案及预防措施

在日常生活和工作中&#xff0c;移动硬盘已成为我们存储数据的重要工具。然而&#xff0c;当遇到移动硬盘不显示容量或无法访问的情况时&#xff0c;我们该如何应对&#xff1f;本文将详细介绍这一问题的现象、原因&#xff0c;并提供两种有效的数据恢复方案&#xff0c;同时还…

深度学习之基于Pytorch框架多人多摄像头摔倒跌倒坠落检测

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 随着智能监控技术的广泛应用&#xff0c;对于公共场合的安全监控需求日益增加。摔倒跌倒坠落是常见的…

申请公众号数量达标

一般可以申请多少个公众号&#xff1f;目前企业主体只能申请2个公众号&#xff0c;这也意味着想做矩阵公众号的难度提升了。有些公司靠着诸多不同分工的公众号形成一个个矩阵&#xff0c;获取不同领域的粉丝。比如&#xff0c;目前主体为xx旗下公众号&#xff0c;共有30个&…

太阳诱电:顺应时代需求的新型电容器为何能在全球得到广泛应用(下)

随着汽车电动化和电子控制化的进展&#xff0c;车载计算机和电气部件也在逐渐向大功率化的方向发展。而构成这些车载设备电源电路的电子元器件也必须随之进行技术革新。太阳诱电集团携手全资子公司ELNA&#xff0c;开发并供应新型电容器“导电性高分子混合铝电解电容器”&#…