SLIC超像素分割算法

SLIC超像素分割算法

《SLIC Superpixels》

摘要

超像素在计算机视觉应用中越来越受欢迎。然而,很少有算法能够输出所需数量的规则、紧凑的超级像素,并且计算开销低。我们介绍了一种新的算法,将像素聚类在组合的五维颜色和图像平面空间中,以有效地生成紧凑,几乎均匀的超级像素。我们的方法十分简单,因此非常容易使用(一个单独的参数指定超像素的数量),并且算法的效率使它非常高且实用。实验表明,我们的方法以较低的计算成本产生超像素,同时实现了分割质量等同或优于四种最先进的方法,以边界召回和分割不足误差来衡量。我们还演示了我们的超像素方法与现有方法相比的两个任务的优势,在这两个任务中,超像素已经被证明在性能上比基于像素的方法更优。

1 介绍

超像素为计算局部图像特征提供了一个方便的原语。它们捕获图像[1]中的冗余,并大大降低了后续图像处理任务的复杂性。它们已被证明在**深度估计[2]、图像分割[3,4]、骨骼化[5]、身体模型估计[6]和物体定位[7]**等应用中越来越有用。

超像素要应用在其他任务中,就必须拥有高效率,并产生高质量的分割。不幸的是,大多数最先进的超像素方法都不能满足所有这些要求。正如我们将演示的那样,它们经常受到高计算成本、低质量分割、不一致的大小和形状或包含多个难以调整的参数的影响。

我们在这项工作中提倡的方法,虽然非常简单,但解决了这些问题,并比最先进的方法更有效地产生高质量、紧凑、几乎均匀的超像素[8,9,5,10]。我们提出的算法,简单线性迭代聚类(SLIC)在L定义的5维空间中对像素进行局部聚类分别是CIELAB颜色空间的L, a, b值以及x,y像素坐标。一种新的距离测量强制紧凑和规则的超像素形状,并无缝适应灰度以及彩色图像。SLIC实现简单,易于在实践中应用{唯一的参数指定所需的超像素数。在伯克利基准数据集[11]上的实验表明,SLIC明显比竞争方法更有效,同时通过标准边界召回和分割不足误差测量产生类似或更好的分割质量。

对于许多视觉任务,紧凑且高度一致的超像素尊重图像边界,例如图1中由SLIC生成的超像素。例如,当从基于像素的图切换到超像素时,条件随机场(CRF)等基于图的模型可以看到速度的显著提高[3,7],但松散或不规则的超像素会降低性能。如果超像素是松散的或不规则的,从超像素位置的图像中提取的SIFT等局部特征将变得不那么有意义和有区别,并且在两个或多个超像素的团上学习统计信息可能不可靠。当我们将SLIC超像素的性能与两种视觉任务(物体类别识别和医学图像分割)的竞争方法进行比较时,可以看到这种效果。在这两种情况下,与现有方法相比,我们的方法以更低的计算成本获得了类似或更好的性能

2 背景

我们对现有的图像分割方法进行了简要回顾,并重点关注了生成超像素的适应性。需要注意的是,并非所有算法都是用于这个目的,所以一些分割可能不够紧凑,但我们仍然需要对它们进行讨论。

大体上,我们将超像素算法分为两类,分别是基于图的和基于梯度上升的方法。我们的研究结果见表格1,我们考虑了分割质量、是否能控制分割数目和大小等因素。

3 SLIC分割算法

我们的方法通过基于像素在图像平面上的颜色相似性和接近性聚类像素来生成超级像素。这是在五维**[labxy]空间**中完成的,其中[lab]是CIELAB颜色空间中的像素颜色向量,它被广泛认为是小颜色距离感知均匀的,xy是像素位置。虽然CIELAB空间中两种颜色之间的最大可能距离(假设sRGB输入图像)是有限的,但xy平面中的空间距离取决于图像大小。在这个5D空间中,如果不将空间距离标准化,就不可能简单地使用欧几里得距离。为了在这个5D空间中聚类像素,因此我们引入了一种考虑超像素大小的新的距离度量。使用它,我们在这个5D空间中强制颜色相似性以及像素接近性,以便预期的簇大小及其空间范围大致相等。

3.1 距离测量

输入的参数为超像素的期望像素数量K,对于N像素的图像,每个超像素的近似大小为N/K个像素,对于大小大致相同的超像素,每个网格间隔 S = N / K S=\sqrt{N/K} S=N/K 都有一个超像素中心。

首先,我们选择K个超像素聚类中心,每个超像素的近似面积大概是 S 2 S^2 S2,相应的搜索区域为每个超像素中心周围的2S*2S区域内。

我们利用欧氏距离来进行度量,引入变量m进行调节(m越大表示空间邻近性越强),公式如下:

D s = d l a b + m S d x y D_s=d_{lab}+\frac{m}{S}d_{xy} Ds=dlab+Smdxy

3.2 算法

我们首先采样K个有规律间隔的聚类中心,并将它们移动到对应于3 × 3邻域中最低梯度位置的种子位置。

然后,我们迭代地重复将像素与最近的聚类中心关联并重新计算聚类中心的过程,直到收敛。

在这个过程的最后,可能会留下一些散落的标签,也就是说,在一个较大的段附近有几个像素具有相同的标签,但没有连接到它。尽管这种情况很少见,但尽管采用了空间接近度度量,这种情况还是会出现,因为我们的集群没有显式地强制连通性。尽管如此,我们在算法的最后一步通过用最大的相邻聚类的标签重新标记不相连的段来加强连通性。这一步是O(N)复杂的,所花费的时间不到分割图像所需总时间的10%。伪代码如下所示,很明显复杂度为O(N)

p9iiG0s.png

python代码实现

# 超像素分割 - 获取图像分块的边界 
def get_slic(img_path, mini_area):
    print(img_path)
    # read image
    origianl_img = cv2.imread(img_path)
    img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)  # RGB转灰度图
    reached_pos_list = []  # 获取可移动区域的坐标集合

    # 二值化图像
    for i in range(img.shape[0]):
        for j in range(img.shape[1]):
            if img[i][j] < 5:  # 设定阈值为10(可调整)
                reached_pos_list.append((i, j))
                img[i][j] = 255
                origianl_img[i][j] = (255, 255, 255)
            else:
                img[i][j] = 0
                origianl_img[i][j] = (0, 0, 0)

    print(len(reached_pos_list))
    print(len(img.flatten()))
    img_copy = img.copy()

    # 初始化slic项,超像素平均尺寸20(默认为10),平滑因子20
    slic = cv2.ximgproc.createSuperpixelSLIC(img, region_size=32, ruler=30.0)
    slic.iterate(100)  # 迭代次数,越大效果越好
    mask_slic = slic.getLabelContourMask()  # 获取Mask,超像素边缘Mask==1
    label_slic = slic.getLabels()  # 获取超像素标签
    number_slic = slic.getNumberOfSuperpixels()  # 获取超像素数目
    mask_inv_slic = cv2.bitwise_not(mask_slic)
    img_slic = cv2.bitwise_and(img, img, mask=mask_inv_slic)  # 在原图上绘制超像素边界

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

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

相关文章

腾讯云COS+SpringBOot实现文件上传下载功能

文章目录 第一步&#xff1a;在.yml文件中配置对应秘钥内容第二步&#xff1a;完成COSConfig类编写第三步&#xff1a;编写Controller类Bug提示&#xff1a; 最近一直在做一个项目&#xff0c;需要支持视频&#xff0c;音频&#xff0c;图片的上传&#xff0c;前面介绍的都是把…

2023年制造业产品经理考NPDP有什么用?

产品经理国际资格认证NPDP是新产品开发方面的认证&#xff0c;集理论、方法与实践为一体的全方位的知识体系&#xff0c;为公司组织层级进行规划、决策、执行提供良好的方法体系支撑。 【认证机构】 产品开发与管理协会&#xff08;PDMA&#xff09;成立于1979年&#xff0c;是…

beef-xss浏览器劫持

beef-xss浏览器劫持 一&#xff0c;实验拓扑图二&#xff0c;租用一台阿里云&#xff0c;搭建docker环境和beef环境1.租一台阿里云服务器&#xff0c;系统选用ubuntu&#xff0c;计时收费的那种&#xff0c;一个小时几毛钱2.开启策略组3000端口&#xff0c;5000端口4.安装docke…

交友项目【查询好友动态,查询推荐动态】实现

目录 1&#xff1a;圈子 1.1&#xff1a;查询好友动态 1.1.1&#xff1a;接口分析 1.1.2&#xff1a;流程分析 1.1.2&#xff1a;代码实现 1.2&#xff1a;查询推荐动态 1.2.1&#xff1a;接口分析 1.2.2&#xff1a;流程分析 1.2.3&#xff1a;代码实现 1&#xff1a…

十五分钟带你学会 Electron

文章目录 什么是 Electron为什么要选择 Electron安装 Electron桌面CSDN实战Electron 基础配置Electron 进程主进程渲染进程主进程与渲染进程的区别主进程与渲染进程的通信 Electron 跨平台问题Electron 部署打包应用程序发布应用程序 Electron 跨端原理总结 什么是 Electron E…

数据库实验 | 第1关:建立和调用存储过程(不带输出参数的存储过程)

任务描述 本关任务&#xff1a; 该实验是针对数据表jdxx&#xff0c;该数据表有四个字段&#xff0c;分别是省份(sf)、城市(cs)、区县(qxmc)、街道(name)。 例如&#xff0c;查询天心区(qxmc)的所有字段的值结果如图所示 任务要求 建立存储过程 dqxx(in city varchar(10),i…

QT QPainter坐标系统和坐标变换

一、坐标变换函数 QPainter 在窗口上绘图的默认坐标系统如图下图所示&#xff0c;这是绘图设备的物理坐标。为了绘图的方便&#xff0c;QPainter 提供了一些坐标变换的功能&#xff0c;通过平移、旋转等坐标变换&#xff0c;得到一个逻辑坐标系统&#xff0c;使用逻辑坐标系统…

BEV+Transformer对无人驾驶硬件体系的巨大改变

摘要&#xff1a; BEVTransformer彻底终结了2D直视图CNN时代&#xff0c;BEVTransformer对智能驾驶硬件系统有着什么样的影响&#xff1f;背后的受益者又是谁&#xff1f; 图片来源&#xff1a;特斯拉 BEVTransformer是目前智能驾驶领域最火热的话题&#xff0c;没有之一&…

【区块链】走进web3的世界-DApp如何快速接入wall

在web3中&#xff0c;wall是您进入区块链的一个标识&#xff0c;每个用户使用的wall都不近相同&#xff0c;因此接入更多的wall是很有必要的&#xff0c;从用户角度来说&#xff0c;非必要情况下&#xff0c;我是不愿意去额外下载wall的。因此今天我们来聊一下&#xff0c;DApp…

开发常用的 Linux 命令2(文件的查看、搜索和权限)

开发常用的 Linux 命令2&#xff08;文件的查看、搜索和权限&#xff09; 作为开发者&#xff0c;Linux是我们必须掌握的操作系统之一。因此&#xff0c;在编写代码和部署应用程序时&#xff0c;熟练使用Linux命令非常重要。这些常用命令不得不会&#xff0c;掌握这些命令&…

【hello Linux】进程程序替换

目录 1. 程序替换的原因 2. 程序替换原理 3. 替换函数 4. 函数解释 5. 命名理解 6.简陋版shell的制作 补充&#xff1a; Linux&#x1f337; 1. 程序替换的原因 进程自创建后只能执行该进程对应的程序代码&#xff0c;那么我们若想让该进程执行另一个“全新的程序”这 便要用…

“分割一切”大模型SAM、超轻量PP-MobileSeg、工业质检工具、全景分割方案,PaddleSeg全新版本等你来体验!

图像分割是计算机视觉的一项基础技术&#xff0c;其目标是将图像中的像素按内容分成不同的类别。它在许多领域有重要应用&#xff0c;比如自动驾驶、工业质检、医疗图像分析、遥感图像解译等。 导读 PaddleSeg 是飞桨高性能图像分割开发套件&#xff0c;在图像分割领域做了大…

IC-14W网络IC卡读写器_银河麒麟桌面操作系统V10适配测试报告

银河麒麟操作系统产品NeoCertify 认证测试报告 系统版本&#xff1a;银河麒麟桌面操作系统V10 厂商名称&#xff1a; 广州荣士电子有限公司 认证产品&#xff1a;IC-14W网络IC卡读写器 测试日期&#xff1a; 2022-11-04 …

基于html+css的图片展示11

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

【unity实战】随机地下城生成1——随机生成地下城初稿(含源码)

先看看实现的最终效果 #用到的素材 https://download.csdn.net/download/qq_36303853/87712757 导入素材 导入房间图片素材,配置图片信息信息 点击sprite Editor,开始切割图片 随机创建基本房间 已一个白底图片模拟房间预设体 思路:建立一个空的 GameObject 用来做…

平凡的Python为什么能一跃成为世界排名第一的语言

本文首发自「慕课网」&#xff0c;想了解更多IT干货内容&#xff0c;程序员圈内热闻&#xff0c;欢迎关注"慕课网"&#xff01; 作者&#xff1a;大周|慕课网讲师 一、前言 本文将结合个人经历为各位同学客观的分析是否有学习Python的必要、Python适合谁学、为什么…

牛客竞赛字符串专题 NC237664 Typewriter(SAM + 树上倍增 + 二分 + 线段树优化dp)

本题主要考察了如何用 SAM 求原串每个前缀对应的能与非后缀匹配的最长后缀&#xff0c;以及如何求 SAM 每个节点 right 集合的 min / max。很有价值的一道串串题。 题意&#xff1a; 你有一台打字机&#xff0c;你需要用它打出一段只由小写字母构成的文本S。 设某个时刻&#…

Linux基础—DHCP原理与配置

Linux基础—DHCP原理与配置 一、DHCP工作原理1.了解DHCP服务使用DHCP的优势DHCP的分配方式 2.DHCP的IP地白动获取工作原理: 二、配置DHCP服务器三、DHCP场景应用实验 一、DHCP工作原理 1.了解DHCP服务 DHCP(Dynamic HostConfiguration Protocol&#xff0c;动态主机配置协议) …

第四章 面向对象(OOP)

目录 一、编程思想 1.1. 面向对象 1.2. 面向过程 1.3.举例说明&#xff08;把大象装进冰箱&#xff09; 1.4.二者的联系与区别 1.5.面向对象的三个阶段 1.6.什么是类&#xff0c;什么是实例&#xff0c;二者的联系 二、面向对象三大特征 2.1 封装 2.2 继承 2.3 多态…

【C++11】智能指针

目录 一、异常层层嵌套执行流乱跳容易导致内存泄漏 二、使用智能指针解决上述问题 1、RAII 2、像指针一样 3、智能指针RAII运算符重载 三、C98的auto_ptr 四、C11的unique_ptr和shared_ptr 1、unique_ptr唯一指针 2、shared_ptr共享指针 2.1shared_ptr是否线程安全 …