Python计算机视觉 第9章-图像分割

news2024/9/20 2:15:34

Python计算机视觉 第9章-图像分割

图像分割是将一幅图像分割成有意义区域的过程。区域可以是图像的前景与背景或图像中一些单独的对象。这些区域可以利用一些诸如颜色、边界或近邻相似性等特征进行构建。

9.1 图割(Graph Cut)

图割(Graph Cut)是一种用于图像分割、能量最小化以及其他计算机视觉任务的离散优化算法。它主要基于图论,将图像分割问题转化为图结构上的最小割问题。

图割的基本概念

  1. 图模型:图割算法将图像表示为一个带权无向图,节点代表像素或像素的特征,边则表示这些节点之间的相似性。图中的每条边都有一个权重,表示两个像素之间的“关系强度”(例如颜色相似度、边缘强度等)。

  2. 源点(Source)和汇点(Sink):图中包含两个特殊节点,称为源点(Source)和汇点(Sink),分别表示前景和背景。在图像分割任务中,目标是将图分割为两部分,分别对应前景(源点关联的部分)和背景(汇点关联的部分)。

  3. 割(Cut):割是将图中的边分成两部分,其中一部分与源点相连,另一部分与汇点相连。算法通过选择一条割线,使得割线两侧的节点分别属于前景和背景。

  4. 最小割问题:在图割算法中,目的是找到一种分割方式,使得割线上的边权重之和最小,这对应于能量最小化问题。通过解决最小割问题,可以得到一个最优的图像分割。

图割的应用

  • 图像分割:将图像中的前景与背景进行分割,常用于对象识别和图像处理。
  • 能量最小化:图割算法可以用于求解一些能量最小化问题,例如图像去噪、图像修复等。
  • 立体匹配:在立体视觉中,图割可以用于匹配两个图像之间的像素,从而计算视差图。

图割算法的流程

  1. 构建图模型:将图像转换为图的形式,节点代表像素,边表示像素间的关系。
  2. 设定能量函数:能量函数由数据项(Data Term)和光滑项(Smoothness Term)组成。数据项表示像素属于前景或背景的代价,光滑项表示相邻像素之间的相似性。
  3. 求解最小割:使用图割算法,找到能量函数最小的割,从而完成图像分割。

图割算法在图像分割任务中具有较高的准确性和鲁棒性,特别是在处理包含噪声的图像时表现良好。然而,它的计算复杂度较高,通常需要较大的计算资源。

9.1.1 从图像创建图

在图割算法中,图像首先需要被表示为一个图结构。这个图通常用 G = ( V , E ) G = (V, E) G=(V,E) 来表示,其中:

  • V V V 表示图的节点集合,对应于图像中的像素或像素块。
  • E E E 表示图的边集合,边连接的节点代表相邻的像素或像素块。

每个节点 v ∈ V v \in V vV 代表一个像素,每条边 e ∈ E e \in E eE 连接两个像素,边上的权重 w e w_e we 反映了这两个像素之间的相似性或距离。

图的构建过程:
  1. 节点定义:每个像素对应图中的一个节点,像素的特征(如颜色、纹理等)可以作为节点的属性。

  2. 边的连接

    • 相邻像素之间通过边连接,形成一个稠密的像素图。
    • 边的权重 w e w_e we 通常根据像素之间的相似度或梯度强度来设定,常用的公式是:

    w e = exp ⁡ ( − ∥ I p − I q ∥ 2 2 σ 2 ) w_e = \exp\left(-\frac{{\lVert I_p - I_q \rVert^2}}{{2\sigma^2}}\right) we=exp(2σ2IpIq2)

    其中, I p I_p Ip I q I_q Iq 分别表示像素 p p p q q q 的颜色向量, σ \sigma σ 表示相似性尺度。

  3. 源点和汇点:图中包含两个特殊节点:

    • 源点(Source):与前景像素连接。
    • 汇点(Sink):与背景像素连接。

    源点和汇点与图中的每个像素节点都有边相连,边的权重反映了该像素属于前景或背景的可能性。

9.1.2 用户交互式分割

用户交互式分割结合了自动图像分割算法和用户的交互输入,以提高分割的准确性。这种方法允许用户提供先验知识,如标记前景和背景区域,来指导分割过程。常见的用户交互式分割方法包括 GrabCutLiveWire

1. GrabCut

GrabCut 是一种基于图割的交互式图像分割方法。用户通过在图像中标记前景和背景区域,指导算法优化分割结果。

主要步骤:
  1. 初始化分割:用户用矩形框标记前景区域。
  2. 图割算法:算法基于标记和图割优化分割结果。
  3. 更新分割:用户可以进一步调整标记以优化分割。
2. LiveWire

LiveWire 是一种交互式图像分割方法,通过用户点击选择图像中的边缘点,使用动态规划找到连接这些点的最佳路径,从而实现精确的分割。

主要步骤:
  1. 用户标记:用户点击图像中目标的边缘点。
  2. 计算代价图:根据图像的梯度计算代价图。
  3. 动态规划:利用动态规划找到最优路径,实现精确分割。

以下为GrabCut示例代码:

import numpy as np
import cv2
import matplotlib.pyplot as plt

# 读取图像
img = cv2.imread(cv2.samples.findFile('img.png'))

# 创建一个mask,初始化为0(背景)
mask = np.zeros(img.shape[:2], np.uint8)

# 创建前景和背景模型
bg_model = np.zeros((1, 65), np.float64)
fg_model = np.zeros((1, 65), np.float64)

# 用户标记前景和背景
# 前景标记区域(矩形)
rect = (50, 50, 450, 290)  # x, y, w, h

# 应用GrabCut算法
cv2.grabCut(img, mask, rect, bg_model, fg_model, 5, cv2.GC_INIT_WITH_RECT)

# 生成前景和背景的掩模
mask2 = np.where((mask == 2) | (mask == 0), 0, 1).astype('uint8')

# 可视化分割结果
result = img * mask2[:, :, np.newaxis]
plt.imshow(cv2.cvtColor(result, cv2.COLOR_BGR2RGB))
plt.title('GrabCut Result')
plt.axis('off')
plt.show()

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

实验图1 GrabCut处理结果

9.2 利用聚类进行分割

图像分割中的聚类方法通过将像素分配到不同的类别或簇中,实现对图像的自动分割。常见的聚类方法有 K-MeansMean Shift,它们根据像素的颜色、亮度或纹理等特征进行分组,来区分图像中的不同区域。

1. K-Means 聚类

K-Means 聚类是一种常用的分割方法,它通过将像素分配到预定义数量的簇( K K K 个簇)中,来实现图像分割。

主要步骤:
  1. 选择簇的数量:设定要分割的区域数( K K K)。
  2. 初始化簇心:随机初始化簇的中心。
  3. 像素分配:将每个像素分配给距离最近的簇心。
  4. 更新簇心:根据分配结果更新簇心。
  5. 迭代:重复分配和更新步骤,直到簇心不再变化或达到最大迭代次数。
2. Mean Shift 聚类

Mean Shift 是一种基于密度的非参数聚类方法。它通过计算密度梯度,寻找高密度区域,并将像素归类到这些区域中。

主要步骤:
  1. 密度估计:为每个像素计算密度梯度。
  2. 移动簇心:沿着密度梯度方向移动,直到到达高密度区域的峰值。
  3. 像素分配:将所有像素分配到最近的高密度区域。

以下为 K-Means 聚类算法示例代码:

import numpy as np
import cv2
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans

# 读取图像
img = cv2.imread(cv2.samples.findFile('test.jpg'))

# 将图像数据转换为二维数组
pixels = img.reshape(-1, 3)

# 设置聚类数
k = 3

# 应用K-Means聚类
kmeans = KMeans(n_clusters=k, random_state=0).fit(pixels)
labels = kmeans.labels_
centers = kmeans.cluster_centers_

# 将标签数据重新转换为图像
segmented_img = centers[labels].reshape(img.shape).astype(np.uint8)

# 可视化原图和K-Means分割结果
fig, axs = plt.subplots(1, 2, figsize=(12, 6))
axs[0].imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
axs[0].set_title('Original Image')
axs[0].axis('off')

axs[1].imshow(cv2.cvtColor(segmented_img, cv2.COLOR_BGR2RGB))
axs[1].set_title('K-Means Clustering Result')
axs[1].axis('off')

plt.show()

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

实验图2 K-Means 聚类算法处理结果

9.3 变分法

变分法是一种数学优化方法,通过寻找使某个函数(通常是能量函数或目标函数)最小化的函数来解决问题。它广泛应用于图像分割、图像恢复、物理模型和其他优化问题。变分法的核心思想是将优化问题转化为一个变分问题,即在函数空间中寻找一个使目标函数达到极值的函数。

变分模型:Chan-Vese 模型

Chan-Vese 模型 是一种基于变分法的图像分割模型,旨在将图像分割成前景和背景区域。它基于图像的灰度信息,通过最小化能量函数来实现分割。该模型特别适用于具有不均匀亮度或纹理的图像。

主要步骤:
  1. 定义目标函数:Chan-Vese 模型的目标函数通常包括内部能量(用于控制轮廓的平滑性)和外部能量(用于匹配图像的前景和背景)。

    目标函数形式为:
    E ( C ) = μ ∫ ∂ C ∣ ∇ ϕ ∣ d s + ν ∫ D C ∣ ∇ I ∣ 2 d x + λ 1 ∫ D C ( I − I ˉ 1 ) 2 d x + λ 2 ∫ D C ˉ ( I − I ˉ 2 ) 2 d x E(C) = \mu \int_{\partial C} | \nabla \phi | ds + \nu \int_{D_C} |\nabla I|^2 dx + \lambda_1 \int_{D_C} (I - \bar{I}_1)^2 dx + \lambda_2 \int_{D_{\bar{C}}} (I - \bar{I}_2)^2 dx E(C)=μC∣∇ϕds+νDC∣∇I2dx+λ1DC(IIˉ1)2dx+λ2DCˉ(IIˉ2)2dx
    其中, C C C 是分割轮廓, ∂ C \partial C C 是轮廓的边界, D C D_C DC D C ˉ D_{\bar{C}} DCˉ 分别是前景和背景区域, I I I 是图像灰度, I ˉ 1 \bar{I}_1 Iˉ1 I ˉ 2 \bar{I}_2 Iˉ2 分别是前景和背景区域的平均灰度值, μ \mu μ ν \nu ν λ 1 \lambda_1 λ1 λ 2 \lambda_2 λ2 是权重参数。

  2. 设置变分形式:将能量函数转化为变分形式,通过对轮廓参数进行优化来最小化目标函数。

  3. 求解变分问题:使用数值方法(如有限差分法或水平集方法)求解变分问题,得到最终的分割轮廓。

  4. 后处理:根据变分解得到的轮廓进行图像分割,提取前景和背景区域。

应用示例:
  • 医学图像分割:在医学图像中分割器官或病变区域。
  • 视频分割:在视频序列中提取前景物体。

总结

变分法是一种强大的数学工具,通过优化函数在函数空间中找到最优解,广泛应用于各种领域。Chan-Vese 模型 是一种典型的变分模型,用于图像分割,特别适用于处理不均匀亮度的图像。通过最小化目标函数,Chan-Vese 模型能够有效地将图像分割成前景和背景区域,广泛应用于医学图像和视频分析等领域。

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

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

相关文章

SOMEIP_ETS_111: SD_Empty_Entries_Array

测试目的: 验证DUT能够忽略声明了条目数组长度为零的SubscribeEventgroup消息。 描述 本测试用例旨在确保DUT在接收到一个Entries数组长度为零的SubscribeEventgroup消息时,能够正确地忽略该消息,不对其进行解释或响应。 测试拓扑&#x…

【机器学习-监督学习】朴素贝叶斯

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈Python机器学习 ⌋ ⌋ ⌋ 机器学习是一门人工智能的分支学科,通过算法和模型让计算机从数据中学习,进行模型训练和优化,做出预测、分类和决策支持。Python成为机器学习的首选语言,…

数据中台建设(七)——数据体系建设

数据体系建设 数据中台是企业数据汇集地,但并不是简单的数据堆积,而是进行分层建模,数据体系建设最终呈现一套完整、规范、准确的数据。数据体系建设就是大数据中数据仓库建设。如下图: 贴源数据层ODS(Operational Data Store)…

python的数据类型详解

python基础 认识python基本类型python的注释风格有三种(也可以说是两种)python的对齐方式python的多行语句折断字符串类型的“计算”列表的常见用法元组的常见用法集合set的常见用法字典的常见用法bytes类型python的输入输出python中的引用 认识python基…

基于环境音频和振动数据的人类活动识别

这篇论文的标题是《Recognition of human activities based on ambient audio and vibration data》,作者是 Marcel Koch 等人,发表在 IEEE Access 期刊上。论文提出了一种基于环境音频和振动数据的分布式多传感器系统,用于识别人类活动。以下…

窗口框架frame(HTML前端)

一.窗口框架 作用&#xff1a;将网页分割为多个HTML页面&#xff0c;即将窗口分为多个小窗口&#xff0c;每个小窗口可以显示不同的页面&#xff0c;但是在浏览器中是一个完整的页面 基本语法 <frameset cols"" row""></frameset><frame…

好的知识竞赛策划公司哪里去找

活动不管多大&#xff0c;都败在策划公司手中&#xff01;要找到好的策划公司&#xff0c;可以考虑以下几个途径&#xff1a; 1.搜索引擎&#xff1a; 通过搜索引擎&#xff0c;可以找到行业内有实力的优秀策划公司。尽管有些公司是打广告&#xff0c;那总比没钱打广告的公司…

Codes 开源研发项目管理平台——敏捷测试管理创新解决方案

前言 Codes 是国内首款重新定义 SaaS 模式的开源项目管理平台&#xff0c;支持云端认证、本地部署、全部功能开放&#xff0c;并且对30人以下团队免费。它通过整合迭代、看板、度量和自动化等功能&#xff0c;简化测试协同工作&#xff0c;使敏捷测试更易于实施。并提供低成本的…

C#与Python脚本使用共享内存通信

实现的功能&#xff1a; C#中读取一张图像&#xff0c;通过共享内存传给python脚本进行处理后将图像进行存储&#xff0c;C#读取处理过后的图像。 C#与python通信有好几种&#xff0c;为什么选择共享内存&#xff1f; 处理图像的速度需求是1秒钟处理5张以上&#xff0c;通过…

《中文Python穿云箭量化平台二次开发技术11》股票基本信息获取分析及应用示例【前十大股东占股比例提取及分析】

《中文Python穿云箭量化平台二次开发技术11》股票基本信息获取分析及应用示例【前十大股东占股比例提取及分析】 《中文Python穿云箭量化平台》是纯Python开发的量化平台&#xff0c;因此其中很多Python模块&#xff0c;我们可以自己设计新的量化工具&#xff0c;例如自己新的行…

1----安卓机型修复串码 开启端口 檫除基带 支持高通与MTK机型工具预览与操作解析

在玩机过程中。很多玩家会碰到各种各样的故障 。其中最多的就在于基带 串码类。由于目前的安卓机型必须修改或者写入串码等参数必须开启端口。而一些初级玩友不太了解开启参数端口的步骤。这个工具很简单的为安卓机型开启端口。并且操作相对简单。 此工具基本功能 1-----可以…

linux入门到实操-4 linux系统网络配置、连接测试、网络连接模式、修改静态IP、配置主机名

教程来源&#xff1a;B站视频BV1WY4y1H7d3 3天搞定Linux&#xff0c;1天搞定Shell&#xff0c;清华学神带你通关_哔哩哔哩_bilibili 整理汇总的课程内容笔记和课程资料&#xff08;包含课程同版本linux系统文件等内容&#xff09;&#xff0c;供大家学习交流下载&#xff1a;…

第15-03章:类的加载与ClassLoader的理解

3、类的加载与ClassLoader的理解 5.1.类加载(ClassLoad)的理解: a.类加载器的作用: 1.将class文件字节码内容加载到内存中&#xff0c;并将这些静态数据转换成方法区的运行时数据结构&#xff0c;然后在堆中生成一个代表这个类的java.lang.Class对象&#xff0c;作为方法区中…

一步迅速了解Linux

1&#xff0c;什么是LInux&#xff1f; Linux 是一个开源的操作系统(管理计算机硬件资源,人物调度)支持多用户,支持网络,支持多线程. 2&#xff0c;Linux特指什么&#xff1f; linux一词,特指的是linux内核 即最操作系统最核心的那一部分功能.负责管理 计算机的硬件资源&…

AIP接口调用

在当今数字化时代&#xff0c;API接口调用已成为连接不同软件和系统的重要手段。特别是在与淘宝这样的大型电商平台进行数据交互时&#xff0c;AIP&#xff08;人工智能平台&#xff09;接口的作用尤为显著。通过AIP接口&#xff0c;开发者可以访问和利用淘宝庞大的商品数据库&…

k8s介绍及部署

目录 一 Kubernetes 简介及部署方法 1.1 应用部署方式演变 1.2 容器编排应用 1.3 kubernetes 简介 1.4 K8S的设计架构 1.4.1 K8S各个组件用途 1.4.2 K8S 各组件之间的调用关系 1.4.3 K8S 的 常用名词感念 1.4.4 k8S的分层架构 二 K8S集群环境搭建 2.1 k8s中容器的管…

[苍穹外卖]-12Apache POI入门与实战

工作台 需求分析: 工作台是系统运营的数据看板, 并提供快捷操作入口, 可以有效提高商家的工作效率 营业额: 已完成订单的总金额有效订单: 已经完成订单的数量订单完成率: 有效订单数/总订单数*100%平均客单价: 营业额/有效订单数新增用户: 新增的用户数量 接口设计: 一个接口返…

RabbitMQ(高阶使用)死信队列

文章内容是学习过程中的知识总结&#xff0c;如有纰漏&#xff0c;欢迎指正 文章目录 一、什么是死信队列&#xff1f; 二、死信队列使用场景 三、死信队列如何使用 四、打车超时处理 1.打车超时实现 以下是本篇文章正文内容 一、什么是死信队列&#xff1f; 先从概念解释上搞…

嵌入式通信原理—SPI总线通信原理与应用

文章目录 SPI 简介基本原理工作模式特点 SPI寻址方式1. 片选&#xff08;Chip Select, CS&#xff09;2. 多从设备通信3. 菊花链&#xff08;Daisy-Chain&#xff09;模式4. 地址寄存器&#xff08;应用层&#xff09; SPI通信过程时钟信号生成&#xff08;SCLK&#xff09;数据…

supermap Iclient3d for cesium加载地形并夸大地形

先看效果图 这是没有夸张之前的都江堰 这是夸大五倍后的都江堰 下面展示代码 主要就是加载supermaponline的skt地形然后夸大 <template><div class"PartOneBox"><div id"cesiumContainer"></div></div> </template>…