分水岭算法简介

news2024/11/15 22:42:46

分水岭算法是一种经典的图像分割技术,广泛应用于图像处理领域。它的名称源自地理学中的“分水岭”概念,即在地形中,水从高处流向低处,最终汇聚成河流的过程。在图像分割中,分水岭算法将灰度图像视为地形,将像素值看作海拔高度。该算法模拟水从各个局部最小值(即山谷)向外扩展,最终在山峰相遇处形成分割边界。

分水岭算法的步骤
  1. 图像预处理

    • 首先,对输入图像进行灰度化处理,然后通过高斯模糊等方法进行平滑,减少噪声的影响。
  2. 图像二值化

    • 通过阈值分割,将图像二值化。通常,采用 Otsu 方法自动确定最佳阈值,以确保前景和背景的有效分离。
  3. 形态学操作

    • 使用形态学开运算去除噪点,并通过膨胀操作填补前景中的空洞,以获得较为平滑的背景区域。
  4. 确定前景和背景

    • 应用距离变换技术,确定前景区域。通过对开运算结果进行距离变换,可以计算前景物体到边缘的距离。然后,通过设定阈值分割,得到前景区域。
    • 背景区域通过膨胀操作从前景区域推导出来。
  5. 找到未知区域

    • 通过将背景区域和前景区域相减,得到未知区域。这些区域通常位于前景和背景之间,是分割的关键部分。
  6. 标记连通区域

    • 对确定的前景区域进行连通区域标记,以标识不同的物体。为了避免背景标记为零,通常将所有标记值加 1,然后将未知区域标记为 0。
  7. 应用分水岭算法

    • 最后,应用分水岭算法,通过不断扩展标记区域,最终在不同物体之间形成分割边界。

代码实现

以下是使用分水岭算法进行图像分割的完整代码示例:

import cv2
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties

# 设置字体为黑体,避免中文显示乱码
font = FontProperties(fname="C:/Windows/Fonts/simhei.ttf", size=12)

# 读取图像
image = cv2.imread('yibgbi.png')  # 将路径替换为你的图像路径
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)  # 转换为灰度图像
blurred = cv2.GaussianBlur(gray, (5, 5), 0)  # 应用高斯模糊,平滑图像

# 二值化图像(使用Otsu方法进行阈值分割)
_, binary = cv2.threshold(blurred, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)

# 形态学操作去噪点和填补空洞
kernel = np.ones((3, 3), np.uint8)  # 定义3x3的卷积核
opening = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel, iterations=3)  # 开运算去除噪点

# 确定背景区域(膨胀操作)
sure_bg = cv2.dilate(opening, kernel, iterations=3)  # 膨胀操作填补空洞,得到确定的背景

# 确定前景区域(距离变换和阈值分割)
dist_transform = cv2.distanceTransform(opening, cv2.DIST_L2, 5)  # 距离变换
_, sure_fg = cv2.threshold(dist_transform, 0.1 * dist_transform.max(), 255, 0)  # 阈值分割得到确定的前景区域
sure_fg = np.uint8(sure_fg)  # 转换为8位整型

# 找到未知区域
unknown = cv2.subtract(sure_bg, sure_fg)  # 背景减去前景得到未知区域

# 标记连通区域
_, markers = cv2.connectedComponents(sure_fg)  # 连通组件标记

# 所有标记加一,确保背景不是0
markers = markers + 1

# 将未知区域标记为0
markers[unknown == 255] = 0

# 应用分水岭算法
markers = cv2.watershed(image, markers)
image[markers == -1] = [255, 0, 0]  # 用红色标记分割边界

# 绘制结果
plt.figure(figsize=(14, 12))

plt.subplot(2, 4, 1)
plt.title("原始图像", fontproperties=font)
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))

plt.subplot(2, 4, 2)
plt.title("二值化图像", fontproperties=font)
plt.imshow(binary, cmap='gray')

plt.subplot(2, 4, 3)
plt.title("开运算去噪点", fontproperties=font)
plt.imshow(opening, cmap='gray')

plt.subplot(2, 4, 4)
plt.title("确定的背景", fontproperties=font)
plt.imshow(sure_bg, cmap='gray')

plt.subplot(2, 4, 5)
plt.title("确定的前景", fontproperties=font)
plt.imshow(sure_fg, cmap='gray')

plt.subplot(2, 4, 6)
plt.title("未知区域", fontproperties=font)
plt.imshow(unknown, cmap='gray')

plt.subplot(2, 4, 7)
plt.title("距离变换", fontproperties=font)
plt.imshow(dist_transform, cmap='gray')

plt.subplot(2, 4, 8)
plt.title("分水岭分割结果", fontproperties=font)
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))

plt.show()

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

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

相关文章

STM32(八):定时器——输入捕获实验

目录 输入捕获模式测频率: 结构图: 步骤: 部分函数详解: 源码: PWMI模式测频率占空比: 结构图: ​编辑 举例说明 源码: 输入捕获模式测频率: 结构图&#xf…

using showdown js with openAi streaming response

题意:"使用 Showdown.js 处理 OpenAI 流式响应" 问题背景: I tried using showdownjs to translate streamed markdown from OpenAi to HTML "我尝试使用 Showdown.js 将来自 OpenAI 的流式 Markdown 转换为 HTML" I changed the …

机器学习第五十四周周报 MAGNA

文章目录 week54 MAGNA摘要Abstract一、文献阅读1. 题目2. Abstract3. 文献解读3.1 Introduce3.2 创新点 4. MAGNA4.1 基础4.2 多跳注意力扩散机制4.3 网络架构4.4 图注意力扩散机制的分析 5. 实验分析5.1 节点分类5.2 知识图谱 6.结论 二、若依系统1. 权限管理2. 数据字典3. 其…

【Linux修行路】进程通信——共享内存

目录 ⛳️推荐 一、直接原理 1.1 共享内存的的申请 1.2 共享内存的释放 二、代码演示 2.1 shmget 2.1.1 详谈key——ftok 2.2 创建共享内存样例代码 2.3 获取共享内存——进一步封装 2.4 共享内存挂接——shmat 2.5 共享内存去关联——shmdt 2.6 释放共享内存——s…

gitee版本控制

前置要求: 安装Git git下载地址:https://git-scm.com/download/win 注册gitee gitee官网:Gitee - 基于 Git 的代码托管和研发协作平台 创建普通项目 目录 git推送远程仓库基本操作 克隆仓库到本地 项目上传 版本管理 分支管理版本…

紧急 浮毛正在挑战免疫系统?推荐榜TOP3浮毛空气净化器使用体验

作为一名多猫家庭的铲屎官,出门路人必知道我养猫,不是把铲屎官三个字大大的打在我脑门上了。而是衣服、裤子上无处不在的猫毛,以前我就靠着人力与各种工具与猫毛斗争,但效果总是差强人意。直到有一天,我因忽视浮毛而患…

Linux 用户缓冲区

1. 文件描述符的分配规则 我们知道Linux进程默认情况下会有3个缺省打开的文件描述符,分别是标准输入stdin--0, 标准输出stdout--1, 标准错误stderr--2。0,1,2对应的物理设备一般是:键盘,显示器,显示器.接下…

字符串原始字面量

简介:C11中添加定义了原始字符串的字面量,定义方式为:R"xxx(原始字符串)xxx",其中()两边的字符串可以省略。原始字面量R可以直接表示字符串的实际含义,而不需要额外对字符串做转译或链接等操作 …

ddpm和ddim小记

前面分析了DDPM和DDIM,但是仍然感觉对其理解不是和透彻,最近又学习了下,简单记录一下进一步的理解。为了方便理解,这里直接以两个像素的灰度图像为例。前面讲过无论是DDPM还是DDIM,他们的训练过程都是一样的&#xff0…

一套采用JAVA语言开发的数字化产科管理平台源码,自主知识产权,三甲综合医院应用案例,系统稳定运行,全套源码交付。

一套采用JAVA语言开发的一套数字化产科管理平台源码,自主知识产权,三甲综合医院应用案例,系统稳定运行。全套源码交付。 数字化产科管理平台源码技术栈: 技术架构:前后端分离 开发语言:Java 开发工具…

深度学习基础--梯度下降与初始化

在神经网络的背景下,它们用于寻找能够最小化损失函数的参数,使模型能够根据输入准确预测训练数据的输出。基本方法是随机选择一组初始参数,然后逐步进行微小调整,平均而言这些调整会降低损失。每一次的调整都是基于当前参数位置对…

ERROR: Cannot uninstall numpy 1.24.2, RECORD file not found.

目录 1.问题描述:2.解决方法:2.1流程2.2结果 小结: 1.问题描述: 卸载 numpy 时报错: ERROR: Cannot uninstall numpy 1.24.2, RECORD file not found. You might be able to recover from this via: pip install --f…

HTB-sequal(mysql)

前言 各位师傅大家好,我是qmx_07,今天给大家讲解sequal这台靶机 渗透过程 信息搜集 服务器开放了3306mysql端口思路:mysql爆破-sC参数会执行 相关的默认脚本 连接mysql数据库 通过空密码连接道mysql数据库flag:7b4bec00d1a39…

【GD32】从零开始学GD32单片机 | USB通用串行总线接口+HID键盘例程(GD32F470ZGT6)

1. 简介 USB,全称通用串行总线,相信大家都非常熟悉了,日常生活只要用到手机电脑都离不开这个接口,像鼠标键盘U盘都需要使用这个接口进行数据传输,下面简单介绍一下。 1.1 版本标准 USB的标准总体可以分为低速、全速和…

04:布局规划

1.切换到丝印层 2.用2D线对模块区域划分

keil5烧录后不自动复位和Flash Download failed - “Cotex-M3“报错解决

目录 项目场景: 复位问题描述 复位原因分析: 复位解决方案: 下载错误问题描述 下载错误原因分析: 下载错误解决方案: 总结 项目场景: keil5编译stm32例程在烧录时候遇到的一些问题 复位问题描述 1. 使…

全面解读LSC局域网屏幕监控软件:功能、优势与应用场景一网打尽!

在信息化高速发展的今天,企业管理的效率和精准度成为决定竞争力的关键因素。 LSC局域网屏幕监控软件(LAN Screen Capture),作为安企神推出的一款专为现代企业量身打造的超级局域网监控管理软件,以其强大的功能和灵活的…

MAC环境导出项目的目录结构

一、安装Homebrew包管理工具 /bin/bash -c "$(curl -fsSL https://gitee.com/ineo6/homebrew-install/raw/master/install.sh)" 官网网址:https://brew.idayer.com/ 二、用brew包管理工具安装tree brew install tree 三、打开终端,导出项目…

怎么用AI做视频总结?

利用AI工具批量生成影视短剧推广https://docs.qq.com/doc/DYnl6d0FLdHp0V2ll 搞个插件就可以了。 我只能说AI的终极目的就是为了视频服务的,语音(配音)、视频脚本(文案)、绘图(画面)、设计&…

数据结构:单链表逆置的相关问题

1.思路:这里主要是用到头插法的思想进行单链表的一个逆置 2.知识点回顾: (1)头插法 [1]什么叫头插法:新增节点在头节点后面(下图为单链表结构) [2&#xf…