从零开始学cv-16:超像素图像分割

news2024/10/5 20:37:11

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、超像素图像分割简介
  • 二:SLIC超像素图像分割
  • 三:Seed超像素分割算法
  • 四 :LSC超像素分割


前言

在数字图像处理和计算机视觉领域,图像分割技术扮演着至关重要的角色。它将复杂的图像分解为若干具有相似特性的区域,为后续的图像理解、分析和应用奠定了基础,本博客将介绍图像分割领域中的一个分支:超像素图像分割。


一、超像素图像分割简介

超像素图像分割是计算机视觉领域的一项重要技术,它将图像细分为一系列具有相似特征的像素集合,这些集合被称为超像素。该方法旨在减少图像处理中的基本单元数量,同时保留关键的结构和纹理信息,从而提升图像处理和分析的效率和精确度。超像素的特点包括紧凑性、同质性和良好的边界保持能力,这使得图像分割过程更加高效和自然。
在具体实现上,流行的超像素分割算法包括SLIC、SEEDS和LSC等。SLIC算法结合颜色和空间信息,通过简单的线性迭代聚类过程,生成大小均匀的超像素。SEEDS算法采用能量驱动采样,通过迭代优化超像素边界,以适应图像的颜色和纹理变化。LSC算法则利用谱聚类技术,更加注重保持图像的细节和边缘信息。在

二:SLIC超像素图像分割

SLIC(Simple Linear Iterative Clustering)是一种用于图像分割的超像素生成算法。它通过简单的线性迭代聚类方法,将图像分割成具有相似特征的像素集合,即超像素。SLIC算法以其效率高、分割质量好、易于实现等特点,在计算机视觉领域得到了广泛应用。
SLIC算法的核心思想是将图像空间划分为多个小的区域,每个区域内的像素在颜色、亮度、纹理等方面具有相似性。以下是SLIC算法的基本步骤:

  1. 初始化聚类中心:在图像中均匀地选择初始聚类中心,通常根据期望的超像素数量来确定。
  2. 距离度量:对于每个聚类中心,算法在它的邻域内搜索像素,并计算像素与聚类中心之间的距离。这个距离是一个综合距离,包括颜色空间的距离和空间距离。
  3. 迭代优化:通过迭代优化过程,不断更新聚类中心和像素的归属,直到满足一定的收敛条件。
  4. 生成超像素:最终,每个聚类中心及其归属的像素形成了一个超像素。

在opencv中存在其实现api:cv2.ximgproc.createSuperpixelSLIC,参数说明:

image: 输入图像,应该是一个 3 通道的彩色图像(通常是 BGR 格式)。
region_size: 超像素区域的大小,即每个超像素的平均大小。这个值越大,生成的超像素数量越少,每个超像素覆盖的面积也越大。
ruler: 空间权重因子,用于平衡颜色相似性和空间接近性。这个值越大,超像素的形状越接近正方形。

一旦创建了 SuperpixelSLIC 对象,就可以使用以下方法来执行超像素分割和获取结果:

slic.iterate(num_iterations)
labels = slic.getLabels()
num_superpixels = slic.getNumberOfSuperpixels()
mask = slic.getLabelContourMask()
其中:iterate: 执行超像素分割的迭代过程,getLabels: 获取每个像素的超像素标签,getNumberOfSuperpixels: 获取生成的超像素的总数,getLabelContourMask: 获取超像素边界的掩码,可以用来在原图上绘制超像素边界。

示例代码:

import cv2
import numpy as np

# 读取图像
img = cv2.imread(r"D:\AI_tool\GFPGAN-master\1.jpg")
img = cv2.resize(img,(0,0),fx=0.5,fy=0.5)
# 初始化SLIC,设置超像素平均尺寸和平滑因子
slic = cv2.ximgproc.createSuperpixelSLIC(img, region_size=20, ruler=20.0)

# 迭代次数,越大效果越好
slic.iterate(10)

# 获取超像素标签和数量
labels = slic.getLabels()
number_of_superpixels = slic.getNumberOfSuperpixels()

# 获取超像素边缘Mask并绘制
mask = slic.getLabelContourMask()
img_slic = cv2.bitwise_and(img, img, mask=mask)
cv2.imshow("img_slic",img_slic)
cv2.waitKey(0)

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

三:Seed超像素分割算法

Seed超像素图像分割算法是一种基于图论的超像素生成方法,它通过在图像中播种(seed)并生长(grow)超像素来达到分割的目的。Seed超像素算法的核心思想是利用像素之间的相似性,将相似的像素聚集成一个超像素。
算法步骤:

  1. 种子点初始化: 在图像中随机或均匀地选择一些像素作为种子点(seed points)。 每个种子点代表一个潜在的超像素中心。
  2. 相似性度量: 计算每个种子点与其邻域像素之间的相似性,通常使用颜色、亮度、纹理等特征。 相似性度量可以基于欧几里得距离或其他距离度量。
  3. 种子点生长: 根据相似性度量,将每个种子点与其最相似的邻域像素合并,形成超像素。
    生长过程中,需要确保每个超像素的大小在一定范围内,并且形状尽可能规则。
  4. 迭代优化: 重复相似性度量和种子点生长步骤,直到满足一定的停止条件,如达到预设的超像素数量或大小。
  5. 后处理: 对生成的超像素进行后处理,如合并过小的超像素,或者调整超像素边界以优化分割结果。

在opencv中提供了Seed的api,cv2.ximgproc.createSuperpixelSEEDS( image_width, image_height, image_channels, num_superpixels, num_levels, prior, num_histogram_bins)
参数说明:

image_width: 输入图像的宽度。
image_height: 输入图像的高度。
image_channels: 输入图像的通道数(例如,对于彩色图像通常是 3)。
num_superpixels: 指定生成的超像素的数量。这个参数对最终的分割结果有直接影响。
num_levels: 指定金字塔的层数。这个参数影响算法的迭代次数和超像素的最终大小。
prior: 指定超像素形状的先验知识。较高的值会产生更规则的超像素形状。
num_histogram_bins: 直方图分箱的数量。用于计算像素之间的相似度,较高的值可以提高算法对图像中颜色变化的敏感度。

使用代码:

import cv2
import numpy as np

# 读取图像
img = cv2.imread(r"D:\AI_tool\GFPGAN-master\1.jpg")
img = cv2.resize(img,(0,0),fx=0.5,fy=0.5)
# 初始化SLIC,设置超像素平均尺寸和平滑因子
seeds = cv2.ximgproc.createSuperpixelSEEDS(img.shape[1], img.shape[0], img.shape[2], 300, 5)

# 应用超像素分割
seeds.iterate(img, 10)  # 迭代次数,可以根据需要调整

# 获取超像素标签
labels = seeds.getLabels()

# 获取超像素数量
num_superpixels = seeds.getNumberOfSuperpixels()

# 在原图上绘制超像素边界
mask = seeds.getLabelContourMask()
img_out = cv2.bitwise_and(img, img, mask=mask)

# 显示结果
cv2.imshow('Superpixels', img_out)
cv2.waitKey(0)
cv2.destroyAllWindows()

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

四 :LSC超像素分割

LSC超像素分割算法的核心思想是将图像像素看作图中的节点,像素之间的相似性通过边的权重来表示。然后,算法在图上执行谱聚类(Spectral Clustering)来形成超像素。

主要步骤:

  1. 构建图: 将图像像素映射为图中的节点。 计算像素之间的相似性度量(如颜色、亮度、纹理等),这些度量作为图中边的权重。
  2. 定义权重矩阵: 根据像素间的相似性,构建一个权重矩阵W,其中W[i, j]表示像素i和像素j之间的权重。
  3. 构造拉普拉斯矩阵: 使用权重矩阵W构造图的标准拉普拉斯矩阵L = D - W,其中D是对角矩阵,D[i, i]是W中第i行的权重之和。
  4. 特征分解: 对拉普拉斯矩阵L进行特征分解,找到最小的几个特征值对应的特征向量。
  5. 聚类: 将这些特征向量组成的矩阵进行k-means聚类,其中k是预定的超像素数量
    聚类结果将图像像素划分为k个超像素。
  6. 优化边界: 为了得到更紧凑的超像素,LSC算法可能会包含一个优化步骤,通过最小化边界像素的权重和来调整超像素的边界。

在opencv中提供了其使用api:superpixel = cv2.ximgproc.createSuperpixelLSC(image, region_size, ratio)
参数说明:

image: 输入图像,它应该是一个8位的3通道图像(通常是彩色图像)。
region_size: 指定超像素区域的大小。这个参数决定了超像素的粗细程度,值越大,生成的超像素数量越少,每个超像素的大小也越大。
ratio: 控制超像素紧凑性的参数。这个参数通常是一个大于0且小于1的值,它影响了超像素之间的边界平滑程度。值越大,超像素越紧凑。

使用代码:

import cv2
import numpy as np

# 读取图像
img = cv2.imread(r"D:\AI_tool\GFPGAN-master\1.jpg")
img = cv2.resize(img,(0,0),fx=0.5,fy=0.5)
# 初始化SLIC,设置超像素平均尺寸和平滑因子
# 创建 LSC 分割器
region_size = 50  # 超像素区域大小
min_element_size = 200  # 最小元素大小


# 创建 LSC 超像素分割器
lsc = cv2.ximgproc.createSuperpixelLSC(img, region_size)

# 运行超像素分割
lsc.iterate(10)  # 迭代次数

# 获取分割结果
num_superpixels = lsc.getNumberOfSuperpixels()
labels = lsc.getLabels()

# 可视化分割结果
labels = np.uint8(labels)
segmented_image = cv2.cvtColor(labels, cv2.COLOR_GRAY2BGR)
segmented_image = cv2.applyColorMap(segmented_image, cv2.COLORMAP_JET)

# 将超像素边界绘制在原始图像上
mask = lsc.getLabelContourMask()
img_lsc = cv2.bitwise_and(img, img, mask=mask)

cv2.imshow('LSC Superpixel Segmentation', img_lsc)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

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

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

相关文章

2、Redis数据安全性分析

文章目录 一、Redis性能压测脚本介绍二、Redis数据持久化机制详解1、整体介绍Redis的数据持久化机制2、RDB详解3、AOF详解4、混合持久化策略 三、Redis主从复制Replica机制详解**1、Replica是什么?有什么用?****2、如何配置Replica?****3、如…

【AI知识点】正态分布(高斯分布)和中心极限定理(CLT)

正态分布(Normal Distribution)和中心极限定理(Central Limit Theorem, CLT) 是统计学中非常重要的概念,它们广泛应用于概率论、数据分析、机器学习等领域。以下将详细解释这两个概念及其关系。 1. 正态分布&#xff…

【C++】入门基础介绍(上)C++的发展历史与命名空间

文章目录 1. 前言2. C发展历史2. 1 C版本更新特性一览2. 2 关于C23的一个小故事: 3. C的重要性3. 1 编程语言排行榜3. 2 C在工作领域中的应用 4. C学习建议和书籍推荐4. 1 C学习难度4. 2 学习书籍推荐 5. C的第一个程序6. 命名空间6. 1 namespace的价值6. 2 namespace的定义6. …

《CUDA编程》4.CUDA程序的错误检测

在编写CUDA程序时,有的错误在编译过程中被发现,称为编译错误,有的在运行时出现,称为运行时刻错误,本章讨论如何排查运行时刻错误 1 一个检测CUDA运行时错误的宏函数 1.1 编写错误检查宏函数 在《CUDA编程》3.简单CUD…

从0到1:培训机构排课小程序开发笔记一

业务调研 随着人们生活水平的提高,健康意识和学习需求日益增强,私教、健身和培训机构的市场需求迅速增长。高效的排课系统不仅可以提升机构的管理效率,还能提高学员的满意度。解决传统的排课方式存在的时间冲突、信息不对称、人工操作繁琐等…

51单片机的家用煤气报警系统【proteus仿真+程序+报告+原理图+演示视频】

1、主要功能 该系统由AT89C51/STC89C52单片机LCD1602显示模块温度传感器CO传感器蓝牙LED、蜂鸣器等模块构成。适用于家用天然气泄露报警器、煤气泄露报警器、无线报警等相似项目。 可实现功能: 1、LCD1602实时显示温度和煤气浓度 2、温度传感器DS18B20采集环境温度 3、CO传…

【Mybatis篇】Mybatis的关联映射详细代码带练 (多对多查询、Mybatis缓存机制)

🧸安清h:个人主页 🎥个人专栏:【计算机网络】,【Mybatis篇】 🚦作者简介:一个有趣爱睡觉的intp,期待和更多人分享自己所学知识的真诚大学生。 目录 🎯一.关联映射概述 &#x1f6a…

【BUG】P-tuningv2微调ChatGLM2-6B时所踩的坑

0.前言 P-tuning v2的实验在网上一抓一大把,这里就说一下我在微调过程中遇到的有些bug,踩过的一些坑,在网上找了很久都没有一些好的解决方案,在这里记录一下。 1.下载预训练模型 在官方给出的教程中,并不需要预先将模…

【springboot】简易模块化开发项目整合Swagger2

接上一项目【springboot】简易模块化开发项目整合MyBatis-plus,进行拓展项目 1.新建模块 右键项目→New→Module,新建一个模块 父项目选择fast-demo,命名为fast-demo-config,用于存放所有配置项 添加后,项目结构如图…

X3U·可编程控制器的定位控制

FX3U可编程控制器的定位控制进行说明。 一、概要 FX3U可编程控制器可以向伺服电机、步进电机等输出脉冲信号,从而进行定位控制。 脉冲频率高的时候,电机转得快:脉冲数多的时候,电机转得多。用脉冲频率、脉冲数来设定定位对象…

Linux基本命令及vim应用实训练习

Linux基本命令及vim应用实训练习 1. 2. 3. 4. 5. 使用man cp找出

4 思科模拟器的介绍和使用

4 思科模拟器的介绍和使用 思科的IOS给我们提供了三大模式 设备开机后,进入的模式是【用户模式】 Router表示设备的名称 “>”表示用户模式 在用户模式输入"?" 可列出在用户模式可以使用的命令 第二种模式是特权模式,输入enable进入特权模式&…

RNN经典案例——构建人名分类器

RNN经典案例——人名分类器 一、数据处理1.1 去掉语言中的重音标记1.2 读取数据1.3 构建人名类别与人名对应关系字典1.4 将人名转换为对应的onehot张量 二、构建RNN模型2.1 构建传统RNN模型2.2 构建LSTM模型2.3 构建GRU模型 三、构建训练函数并进行训练3.1 从输出结果中获得指定…

字符和ACSII编码

1.字符和ASCII编码 C语言中char类型,专门用来创建字符变量,字符放在单引号中 char ch a ASCII码表 c官网,最全de c官网链接 数字字符0~9对应ASCII码十进制48~57 字符 大写字母A~Z对应ASCII码十进制65~90 字符 小写字母a~z对应ASCII码…

EtherCAT 转 EtherNet/IP, EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关

EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关https://item.taobao.com/item.htm?ftt&id822721028899协议转换通信网关 EtherCAT 转 EtherNet/IP GW系列型号 MS-GW12 概述 MS-GW12 是 EtherCAT 和 EtherNet/IP 协议转换网关,为用户提供两…

突发!Meta重磅发布Movie Gen入局视频生成赛道!

引言 Meta于2024年10月4日首次推出 Meta Movie Gen,号称是迄今为止最先进的媒体基础模型。Movie Gen 由 Meta 的 AI 研究团队开发,在一系列功能上获取最先进的效果,包括:文生视频、创建个性化视频、精准的视频编辑和音频创作。 …

递归--C语言

1 递归定义 函数自己调用自己的过程,称为递归。 2 递归的必要条件 1.必须要有终止条件。达到条件就停止递归,退出函数。2.每次调用自己都要越来越接近这个终止条件。 因此写函数的时候,也分两部分 第一部分:写终止条件&#x…

点击按钮提示气泡信息(Toast)

演示效果&#xff1a; 目录结构&#xff1a; activity_main.xml(布局文件)代码&#xff1a; <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http:…

【第三版 系统集成项目管理工程师】第15章 组织保障

持续更新。。。。。。。。。。。。。。。 【第三版】第十五章 组织保障 15.1信息和文档管理15.1.1 信息和文档1.信息系统信息-P5462.信息系统文档-P546 15.1.2 信息(文档)管理规则和方法1.信息(文档)编制规范-P5472.信息(文档)定级保护-P5483.信息(文档)配置管理-P549练习 15.…

38 文件包含(标准库头文件、自定义头文件)、相对路径与绝对路径、条件编译(#if、#ifdef、#if define、#ifndef)

目录 1 文件包含 1.1 #include 指令 1.2 包含标准库头文件 1.3 包含自定义头文件 1.3.1 使用相对路径 1.3.2 使用绝对路径 2 条件编译 2.1 #if … #endif 2.1.1 语法格式 2.1.2 功能说明 2.1.3 流程分析 2.1.4 案例演示&#xff1a;#if 0 ... #endif 2.1.5 案例演…