《数字图像处理-OpenCV/Python》第15章:图像分割

《数字图像处理-OpenCV/Python》第15章:图像分割


本书京东 优惠购书链接 https://item.jd.com/14098452.html
本书CSDN 独家连载专栏 https://blog.csdn.net/youcans/category_12418787.html

在这里插入图片描述


第15章:图像分割


图像分割是由图像处理到图像分析的关键步骤,是计算机视觉的基础,也是图像理解的重要组成部分。图像分割的基本方法是指基于图像灰度值的不连续性和相似性,根据灰度、彩色、空间纹理和几何形状等特征,把图像划分成若干个具有特殊性质的区域,或把目标从背景中分离出来。

本章内容概要

  • 介绍区域生长与分离和超像素区域分割算法。
  • 学习分水岭算法,实现图像分割。
  • 学习图割分割算法,实现图像分割。
  • 学习均值漂移算法,实现目标描述与定位。
  • 学习运动图像分割算法,如帧间差分法、背景差分法和密集光流法。

15.3 分水岭算法

分水岭算法是一种图像区域分割算法,以邻近像素间的相似性作为重要特征,从而将空间位置相近且灰度值相近的像素点连接起来,构成一个封闭的轮廓。

分水岭算法是指将像素值视为海拔高度,图像就像一张高低起伏的地形图,每个局部极小值及其影响区域称为集水盆,集水盆的边界则形成分水岭。

算法的实现过程可以理解为洪水淹没的过程:最低点首先被淹没,然后水逐渐淹没整个山谷;水位升高到一定高度就会溢出,于是在溢出位置修建堤坝;不断提高水位,重复上述过程,直到所有的点被淹没。所建立的一系列堤坝就成为分隔各个盆地的分水岭。

分水岭算法的计算过程是一个迭代标注过程,通过寻找集水盆和分水岭对图像进行分割。经典的分水岭算法分为排序过程和淹没过程两个步骤:首先对每个像素的灰度级从低到高排序;然后在从低到高的淹没过程中,对每个局部极小值在对应高度的影响域进行判断及标注。

分水岭算法是基于形态学的图像分割算法,体现了边缘检测、阈值处理和区域提取的概念和思想,往往会产生更稳定的分割结果。

最简单的分水岭算法能基于距离变换,通过像素到最近的零像素点的距离生成标注图像;基于梯度的分水岭算法能通过梯度函数使集水盆只响应想要探测的目标,对微弱边缘有良好的响应,但噪声容易导致过分割;基于标记点(标记符控制)的分水岭算法是主流的分割算法,其思想是利用先验知识来帮助分割。


OpenCV中的函数cv.watershed能实现基于标记点的分水岭算法。
使用函数cv.watershed输入标记图像,图像中每个非零像素代表一个标签,对图像的部分像素做标记,表明它的所属区域是已知的。

函数原型

cv.watershed(image, markers[, ]) → markers

参数说明

  • image:输入图像,是8位三通道彩色图像。
  • markers:标记图像,是32位单通道图像。

注意问题

  • (1) 分水岭算法要求必须在标记图像markers中用索引勾勒出需要分割的区域,每个区域被赋值为1、2、3…等索引序号,对应不同的目标物体。
  • (2) 将标记图像markers中未知区域的像素值设置为0,通过分水岭算法确定这些像素属于背景还是前景区域。
  • (3) 输出的标记图像markers中,每个像素都被赋值为1、2、3…等索引序号,-1表示区域之间的边界(分水岭)。

OpenCV中的函数cv.distanceTransform能实现距离变换,计算图像中每个像素到最近的零像素点的距离。


【例程1504】基于距离变换的分水岭算法

本例程介绍基于距离变换的分水岭算法的实现方法,通过每个像素到最近的零像素点生成标注图像。
基于距离变换的分水岭算法的主要步骤如下。
(1) 通过阈值分割将灰度图像转换为二值图像,使用开运算消除噪点。
(2) 通过形态学的膨胀运算,生成确定背景区域sureBG。
(3) 通过距离变换,由阈值分割得到高亮区域,生成确定前景区域sureFG。
(4) 对确定前景区域进行连通性分析,即对多个分割目标编号。
(5) 确定前景区域与确定背景区域重合的部分,作为待定区域unknown。
(6) 从连通域标记图像中去除确定背景区域,作为标注图像。
(7) 基于标记图像使用分水岭算法进行分割,得到分割的目标轮廓,标注为-1。


# 【1504】基于距离变换的分水岭算法
import cv2 as cv
import numpy as np
from matplotlib import pyplot as pltif __name__ == '__main__':img = cv.imread("../images/Fig0301.png", flags=1)  # 彩色图像(BGR)gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)  # 灰度图像# 阈值分割,将灰度图像分为黑白二值图像ret, thresh = cv.threshold(gray, 0, 255, cv.THRESH_OTSU)# 形态学操作,生成确定背景区域 sureBGkernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3))  # 生成 3×3 结构元opening = cv.morphologyEx(thresh, cv.MORPH_OPEN, kernel, iterations=2)  # 开运算,消除噪点sureBG = cv.dilate(opening, kernel, iterations=3)  # 膨胀操作,生成确定背景区域# 距离变换,生成确定前景区域 sureFGdistance = cv.distanceTransform(opening, cv.DIST_L2, 5)  # DIST_L2: 3/5_, sureFG = cv.threshold(distance, 0.1 * distance.max(), 255, cv.THRESH_BINARY)  # 阈值选择 0.1max 效果较好sureFG = np.uint8(sureFG)# 连通域处理ret, component = cv.connectedComponents(sureFG, connectivity=8)  # 对连通区域进行标号,序号为 0-N-1markers = component + 1  # OpenCV 分水岭算法设置标注从 1 开始,而连通域标注从 0 开始kinds = markers.max()  # 标注连通域的数量maxKind = np.argmax(np.bincount(markers.flatten()))  # 出现最多的序号,所占面积最大,选为底色markersBGR = np.ones_like(img) * 255for i in range(kinds):if (i!=maxKind):colorKind = np.random.randint(0, 255, size=(1, 3))markersBGR[markers==i] = colorKind# 去除连通域中的背景区域部分unknown = cv.subtract(sureBG, sureFG)  # 待定区域,前景与背景的重合区域markers[unknown==255] = 0  # 去掉属于背景的区域 (置零)# 用分水岭算法标注目标的轮廓markers = cv.watershed(img, markers)  # 分水岭算法,将所有轮廓的像素点标注为 -1# 把轮廓添加到原始图像上mask = np.zeros(img.shape[:2], np.uint8)mask[markers==-1] = 255mask = cv.dilate(mask, kernel=np.ones((3,3)))  # 轮廓膨胀,使显示更明显imgWatershed = img.copy()imgWatershed[mask==255] = [255, 0, 0]  # 将分水岭算法标注的轮廓点设为蓝色plt.figure(figsize=(9, 6))plt.subplot(231), plt.axis('off'), plt.title("1. Original")plt.imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB))plt.subplot(232), plt.axis('off'), plt.title("2. Gray image")plt.imshow(gray, 'gray')plt.subplot(233), plt.axis('off'), plt.title("3. Sure background")plt.imshow(sureBG, 'gray')  # 确定背景plt.subplot(234), plt.axis('off'), plt.title("4. Sure frontground")plt.imshow(sureFG, 'gray')  # 确定前景plt.subplot(235), plt.axis('off'), plt.title("5. Markers")plt.imshow(cv.cvtColor(markersBGR, cv.COLOR_BGR2RGB))plt.subplot(236), plt.axis('off'), plt.title("6. Watershed")plt.imshow(cv.cvtColor(imgWatershed, cv.COLOR_BGR2RGB))plt.tight_layout()plt.show()

在这里插入图片描述

图15-4 基于距离变换的分水岭算法

程序说明:

(1) 运行结果,基于距离变换的分水岭算法如图15-4所示。图15-4(1)所示为原始图像,图15-4(2)所示为图15-4(1)的灰度图。
(2) 图15-4(3)所示为确定背景,图中的黑色区域为确定背景区域,由阈值分割和形态学处理得到。图15-4(4)所示为确定前景,图中的白色区域为确定前景区域,由距离变换和阈值处理得到。
(3) 图15-4(5)所示为由分水岭算法得到的标记图像,图15-4(6)所示为把标记的轮廓添加到图15-4(1)上的图像。其中,轮廓膨胀并非必要步骤,只是为了使图像中的轮廓显示更醒目。


【例程1505】基于轮廓标记的分水岭算法

基于轮廓标记的分水岭算法的思想是利用先验知识帮助分割。本例程先用梯度算子进行边缘检测,然后通过查找图像轮廓,生成标记图像来引导分割。
基于轮廓标记的分水岭算法的步骤如下。
(1) 对图像进行梯度处理,以获得梯度图像。
(2) 查找梯度图像和绘制图像轮廓。
(3) 基于图像轮廓生成标记图像。
(4) 基于标记图像使用分水岭算法进行分割,得到各个分割目标的轮廓。


版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/139433259)
Copyright 2024 youcans, XUPT
Crated:2024-06-04

《数字图像处理-OpenCV/Python》 独家连载专栏 : https://blog.csdn.net/youcans/category_12418787.html

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

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

相关文章

spark的简单学习二

一 spark sql基础 1.1 Dataframe 1.介绍: DataFrame也是一个分布式数据容器。然而DataFrame更像传统数据库的二维表 格,除了数据以外,还掌握数据的结构信息,即schema。同时,与Hive类似,DataFrame也支 持…

STM32_HAL_I2C_串行接口

电气特性 I2C(Inter-Integrated Circuit)是一种由飞利浦公司(现恩智浦半导体)开发的串行通信协议,用于连接低速外围设备。I2C总线只需要两根线(SDA:串行数据线,SCL:串行…

免费生物蛋白质的类chatgpt工具助手copilot:小分子、蛋白的折叠、对接等

参考: https://310.ai/copilot 可以通过自然语言对话形式实现小分子、蛋白质的相关处理:生成序列、折叠等 应该是agent技术调用不同工具实现 从UniProt数据库中搜索和加载蛋白质。使用ESM Fold方法折叠蛋白质。使用310.ai基础模型设计新蛋白质。使用TM-Align方法比较蛋白质…

【Spring Cloud】微服务链路跟踪Sleuth

目录 为什么要使用微服务链路跟踪微服务的现状多服务协同工作复杂的调用链条容易出错 微服务链路跟踪需要实现的需求实现监控决策避免技术债务快速定位故障 微服务链路跟踪的技术要求低消耗应用透明延展性可控采样率可视化 Spring Cloud Sleuth简介Spring Cloud Sleuth的4个特点…

Shell脚本快速入门

为什么要学shell?能做什么? 答:CI/CD 持续集成,自动化部署作业方式,需要将一系列linux命令程序化,shell 就能做到,提高运维人员的工作效率。 指定解析器: (1) shell解析器 #…

Linux网络-自定义协议、序列化和反序列化、网络计算服务器的实现和Windows端客户端

文章目录 前言一、自定义协议传结构体对象 序列化和反序列化什么是序列化?反序列化 二、计算器服务端(线程池版本)1.main.cc2.Socket.hpp3.protocol.hpp4.Calculator.hpp5.serverCal.hpp6.threadPool.hpp7.Task.hpp8. log.hpp 客户端Windows客…

小白级教程—安装Ubuntu 20.04 LTS服务器

下载 本教程将使用20.04版进行教学 由于官方速度可能有点慢,可以下方的使用清华镜像下载 https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/ 点击20.24版本 选择 ubuntu-20.04.6-live-server-amd64.iso 新建虚拟机 下载好后 我们使用 VMware 打开它 这里选…

一篇文章讲透排序算法之归并排序

0.前言 本篇文章将详细解释归并排序的原理,以及递归和非递归的代码原理。 一.概念 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使…

苹果或面临退一赔三,新iPad悄悄砍了核心规格

618 快过去了一半,各家都卖的如火如荼,这其中当属苹果搞得最热火朝天。 某东手机竞速榜中,iPhone15 Pro Max 销量稳坐头把交椅,平板方面虽然没有统计表,但是相信销量也是不差。 加上今年刚刚发布的新系列的 iPad&…

求助!什么软件可以人声分离?手机上可以进行人声分离操作吗?

在数字时代,音频处理变得越来越重要,而人声分离技术则是其中的一项关键技术。很多人可能都有过这样的疑问:什么软件可以实现人声分离?手机上能否进行人声分离操作?今天,我们就来为大家解答这些问题&#xf…

提取伴奏与人声分离软件:5款手机必备音频软件

在数字音乐的浪潮中,音频处理软件已经成为手机用户不可或缺的工具。特别是在音乐制作、卡拉OK伴奏制作以及日常音频编辑中,人声与伴奏的分离显得尤为重要。本文将为您介绍五款免费且实用的手机音频软件,它们都具有人声与伴奏分离的功能&#…

spring boot 3.x版本 引入 swagger2启动时报错

一,问题 Spring Boot 3.x版本的项目里,准备引入Swagger2作为接口文档,但是项目启动报错: java.lang.TypeNotPresentException: Type javax.servlet.http.HttpServletRequest not present at java.base/sun.reflect.generics.…

安装windows x64的开源录屏软件GifCapture

下载压缩包 GIF软件 安装报错 下载.NET桌面版运行 .NET 即可在最近安装部分找到GifCapture打开使用

容器项目之前后端分离

容器化部署ruoyi项目 #需要的镜像nginx、java、mysql、redis、 #导入maven镜像、Java镜像和node镜像 docker load -i java-8u111-jdk.tar docker load -i maven-3.8.8-sapmachine-11.tar docker load -i node-18.20.3-alpine3.20.tar #拉取MySQL和nginx镜像 docker pull mysql…

【JavaScript】ECMAS6(ES6)新特性概览(二):解构赋值、扩展与收集、class类全面解析

🔥 个人主页:空白诗 🔥 热门专栏:【JavaScript】 文章目录 🌿 引言五、 Destructuring Assignment - 解构赋值,数据提取的艺术 🎨📌 数组解构📌 对象解构&

文件夹突变解析:类型变文件的数据恢复与预防

在数字化时代,文件夹作为我们存储和组织数据的基本单元,其重要性不言而喻。然而,有时我们可能会遇到一种令人困惑的情况——文件夹的类型突然变为文件,导致无法正常访问其中的内容。这种现象不仅会影响我们的工作效率,…

Solon2分布式事件总线的应用价值探讨

随着现代软件系统的复杂性日益增加,微服务架构逐渐成为开发大型应用的主流选择。在这种架构下,服务之间的通信和协同变得至关重要。Solon2作为一个高性能的Java微服务框架,其分布式事件总线(Distributed Event Bus)为微…

FastAPI给docs/配置自有域名的静态资源swagger-ui

如果只是要解决docs页面空白的问题,可先看我的这篇博客:FastAPI访问/docs接口文档显示空白、js/css无法加载_fastapi docs打不开-CSDN博客 以下内容适用于需要以自用域名访问swagger-ui的情况: 1. 准备好swagger-ui的链接,如&am…

读后感:《SQL数据分析实战》运营SQL实用手册

学习SQL,先有用起来,有了使用价值,之后才是去了解它的原理,让使用更加顺畅。 在大部分业务场景中,通过SQL可以快速的实现数据处理与统计。《SQL数据分析实战》区别于其他工具书,它并没有介绍SQL是什么&…

为何限定项目的 Node.js 版本

首先区分三个概念nvm,npm,nodejs。 Node.js: Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环境。它允许开发者使用 JavaScript 在服务器端编写应用程序,而不仅限于在浏览器中运行 JavaScript。Node.js 提供了一系列内置的模块和 API,使得开发…