《数字图像处理-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 plt

if __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)
    # 形态学操作,生成确定背景区域 sureBG
    kernel = 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)  # 膨胀操作,生成确定背景区域
    # 距离变换,生成确定前景区域 sureFG
    distance = 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-1
    markers = component + 1  # OpenCV 分水岭算法设置标注从 1 开始,而连通域标注从 0 开始
    kinds = markers.max()  # 标注连通域的数量
    maxKind = np.argmax(np.bincount(markers.flatten()))  # 出现最多的序号,所占面积最大,选为底色
    markersBGR = np.ones_like(img) * 255
    for 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] = 255
    mask = 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

关于gitee上传成功没有绿点

今天上传完代码以后,打开gitee看了一下,但是看到昨天和今天都没有小绿点,仔细思考了一番,是仓库满了?不对啊,如果满了的话,上传就会失败啊,那这是什么问题呢? 原来是因为…

Parallels Desktop for Mac 19.4.0更新了哪些内容?有什么改进?

带来了重新设计的共享 Mac 文件夹版本,这些文件夹现在是符号链接,像指针一样指向您的 Mac 文件夹中的文件,同时仍然显示在 Windows 的本地磁盘上。 修复了由于共享文件夹问题导致 NinjaTrader 无法正常启动的问题。 修复了由于共享文件夹问…

2024中国跨境电商海外营销观察报告

来源:霞光智库 近期历史回顾:战略测量的未来报告 2024影响力系列白皮书(第五册)——绿氢 2024年Z世代与千禧一代调研报告.pdf 2023中国车规级芯片产业白皮书.pdf 2024全球网文应用营销洞察报告.pdf 2024年Q1抖音女性卫生用品行业趋…

操作系统教材第6版——个人笔记1

第一章 计算机操作系统概述 操作系统是计算机系统中最重要的系统软件,它统一管理计算机系统的硬件资源与信息资源,控制与调度上层软件的执行并为其提供易于使用的接口。从资源管理、程序控制、操作控制、人机交互、程序接口、系统结构6个角度深入观察操…

JS冒泡排序案例详解

先看一下案例效果&#xff1a; HTML代码&#xff1a; <input type"text" value"" id"bubble-input"> <button onclick"bubbleSort()">冒泡排序</button> <h4 id"bubbleSort-result"></h4>J…

vue2 bug求助!!!(未解决,大概是浏览器缓存的问题或者是路由的问题)

我的vue2项目出现了一个超级恶心的bug 过程&#xff1a; 1 操作流程&#xff1a;页面a点击a标签->到页面b->页面b用户退出刷新页面->点击浏览器的返回按钮返回上一页 2 结果&#xff1a;返回页面后页面没有刷新导致用户名还显示着&#xff0c;页面没有发生任何变化&a…

5.3.2网安学习第五阶段第三周回顾(个人学习记录使用)

本周重点 ①网络安全攻防技术体系 ②Windows入侵排查 ③Linux入侵排查 ④僵蠕木毒排查与处理 本周主要内容 ①网络安全攻防技术体系 一、攻击层面 1、分类 &#xff08;1&#xff09;指定目标&#xff1a;APT攻击手段&#xff0c;对指定目标进行长期作战和渗透&#x…

从Multisim到Proteus,再到SmartEDA:电子设计软件的进化之旅

在电子设计领域&#xff0c;软件工具的演进犹如一条璀璨的轨迹&#xff0c;记录着科技进步的每一个步伐。从Multisim的初创&#xff0c;到Proteus的崛起&#xff0c;再到如今SmartEDA的崭露头角&#xff0c;这些电子设计软件不仅极大地提升了设计效率&#xff0c;更推动了整个行…

函数高级:函数的默认参数|函数的占位参数|函数重载

函数的默认参数 函数占位参数 函数重载 总结&#xff1a; 函数的形参&#xff0c;有自己的参数值就用参数值&#xff0c;没有就用形参列表的默认值。 参数列表中&#xff0c;某位置有自己的默认值&#xff0c;从该位置起&#xff0c;往后就都必须设有默认值。 函数声明和函数…

一键设置常用纸张和页面边距-Word插件-大珩助手

Word大珩助手是一款功能丰富的Office Word插件&#xff0c;旨在提高用户在处理文档时的效率。它具有多种实用的功能&#xff0c;能够帮助用户轻松修改、优化和管理Word文件&#xff0c;从而打造出专业而精美的文档。 【新功能】常用纸张和常用边距 1、一键设定符合中国人常用…

器利而事善——datagrip 的安装以及连接mysql

一&#xff0c;安装 下载&#xff1a;直接到官网下载即可&#xff0c; 破解&#xff1a;这是破解连接&#xff1a;https://pan.baidu.com/s/11BgOMp4Z9ddBrXwCVhwBng &#xff0c;提取码&#xff1a;abcd&#xff1b; 下载后&#xff0c;选择倒数第三个文件&#xff0c;打开da…

ant design vue 表格错位,表头错位

ant design vue 表格错位,表头错位 在官网中,我们可以看到下面图片的描述: 好的,我们按照官网来一波,前面都设置了固定宽度,娃哈哈就不设置了.会出现下面效果 为啥会多了一个竖线(因为按照官网来一波x:1300,这个1300太小的原因) 3.那我们把1300改成1600,1700试试,结果也不是…

揭秘大数据时代的数据库存储引擎:关系型、NoSQL与NewSQL如何选择?

文章目录 01 关系型数据库&NoSQL数据库&NewSQL数据库1. 关系型数据库2. NoSQL数据库3. NewSQL数据库 02 OLTP&OLAP&HTAP对比1. OLTP数据库2. OLAP数据库3. HTAP数据库 03 总结 在大数据和AI时代&#xff0c;数据库成为各类应用不可或缺的重要组成部分。而数据库…

机器学习AI大模型的开源与闭源:哪个更好?

文章目录 前言一、开源AI模型1.1 开源的优点1.2 开源的缺点 二、闭源AI模型2.1 闭源的优点2.2 闭源的缺点 三、开源与闭源的平衡3.1 开源与闭源结合的案例3.2 开源与闭源的战略选择 小结 前言 在过去的几年里&#xff0c;人工智能&#xff08;AI&#xff09;和机器学习&#xf…

操作系统复习-linux的进程管理

linux的进程管理 linux进程的相关概念 进程的类型 前台进程 前台进程就是具有终端&#xff0c;可以和用户交互的进程&#xff0c;会占用终端shell&#xff0c;不可以输入其他的命令。 后台进程 前台进程就是具有终端&#xff0c;可以和用户交互的进程。 不会占用终端shell&a…

算法金 | Python 中有没有所谓的 main 函数?为什么?

​大侠幸会&#xff0c;在下全网同名[算法金] 0 基础转 AI 上岸&#xff0c;多个算法赛 Top [日更万日&#xff0c;让更多人享受智能乐趣] 定义和背景 在讨论Python为何没有像C或Java那样的明确的main函数之前&#xff0c;让我们先理解一下什么是main函数以及它在其他编程语言…

【精度高+低功耗+高灵敏】十六通道电容式触摸芯片GT316L

GT316L是一款功能强大的电容式触摸触控芯片&#xff0c;它支持16通道触摸感应输入&#xff0c;适用于多种形式的触摸按键控制&#xff1b;相比国产芯片&#xff0c;具备更强大的抗干扰能力、灵敏度调节、自动校准能力、高可靠性、快速唤醒模式、超低功耗10uA左右等优点;内置了灵…

day29--mybatis(二) 进阶

一.接口代理方式实现Dao 1.1 代理开发方式介绍 ​ 采用 Mybatis 的代理开发方式实现 DAO 层的开发&#xff0c;这种方式是我们后面进入企业的主流。 Mapper 接口开发方法只需要程序员编写Mapper 接口&#xff08;相当于Dao 接口&#xff09;&#xff0c;由Mybatis 框架根据接…

一键生成迷宫-Word插件-大珩助手新功能

Word大珩助手是一款功能丰富的Office Word插件&#xff0c;旨在提高用户在处理文档时的效率。它具有多种实用的功能&#xff0c;能够帮助用户轻松修改、优化和管理Word文件&#xff0c;从而打造出专业而精美的文档。 【新功能】迷宫生成器 1、可自定义迷宫大小&#xff1b; …

RocketMQ相关知识知多少

一、RocketMQ的定义 官网网址&#xff1a;领域模型概述 | RocketMQ Apache RocketMQ 自诞生以来&#xff0c;因其架构简单、业务功能丰富、具备极强可扩展性等特点被众多企业开发者以及云厂商广泛采用。历经十余年的大规模场景打磨&#xff0c;RocketMQ 已经成为业内共识的金…