Python实现超像素分割

article/2025/10/1 8:11:11

目录

    • 一、什么是超像素?
    • 二、超像素具有哪些特点?
    • 三、Simple Linear Iterative Clustering (SLIC)算法实现步骤
    • 四、SLIC算法代码实现
    • 五、效果展示和分析
    • 六、基于超像素的边缘检测代码
    • 七、基于超像素的边缘检测效果展示与分析
    • 八、思维扩展
    • 参考资料
    • 注意事项

一、什么是超像素?

  超像素概念是2003年Xiaofeng Ren提出和发展起来的图像分割技术,它是指具有相似纹理、颜色、亮度等特征的相邻像素构成的有一定视觉意义的不规则像素块。它利用像素之间特征的相似性将像素分组,用少量的超像素代替大量的像素来表达图片特征,很大程度上降低了图像后处理的复杂度,所以通常作为分割算法的预处理步骤。该技术已经被广泛的应用到图像分割、姿势估计、目标跟踪、目标识别等多个计算机视觉任务等。下图展示了几种不同的超像素分割算法的分割结果。
在这里插入图片描述

二、超像素具有哪些特点?

  • 计算效率比较高。 虽然计算实际的超像素组可能很昂贵,但它允许我们将图像本身的复杂性从几十万像素降低到几百像素。这些超级像素中的每一个都将包含某种感知的、理想的语义值。
  • 含有更多的感知信息。 单个的像素网格其实并没有太大的感知意义,而超像素组中的像素具有共性,例如相似的颜色或纹理分布。下图展示了这种情况,单单将图中箭头所指的图像像素网格进行放大后并不能得到什么感知信息。
    在这里插入图片描述
  • 过度分割可以减少像素损失。 大多数的超像素算法都会使图像失真。这意味着图像中的大部分重要边界都被找到了;但是它的代价是生成许多无关紧要的边界。虽然这听起来像是使用超级像素的问题,但实际上它会带来优点,这种过度扩张的最终结果是-从像素网格到超级像素映射的像素损失非常小。
  • **超像素上表示图形更加高效。**在50000 x 50000像素的网格上构建一个图形,其中每个像素表示图形中的一个节点,这将会导致非常大的表示量。但是,假设我们将超像素应用到像素网格空间,留下(任意)200个超像素块。在这种表示中,在200个超级像素上构建一个图实际上更加有效。

三、Simple Linear Iterative Clustering (SLIC)算法实现步骤

  • 步骤1-初始化种子点(聚类中心):按照设定的超像素组个数,在图像内均匀的分配一些种子点。假设图片总共有含有N 个像素点,预分割为 K 个相同尺寸的超像素,那么每个超像素的大小为N/ K ,则相邻种子点的距离或者步长近似可以表示为S=sqrt(N/K)。
  • 步骤2-在种子点的n*n邻域内重新选择种子点(一般取n=3)。首先计算该邻域内所有像素点的梯度值;然后将种子点移到该邻域内梯度最小的地方。这样做的目的是为了避免种子点落在梯度较大的轮廓边界上,以免影响后续聚类效果。
  • 步骤3-在每个种子点周围的邻域内为每个像素点分配类标签(即属于哪个聚类中心)。和标准的k-means在整张图中搜索不同,SLIC的搜索范围限制为2S2S,可以加速算法收敛,具体的区别如下图所示。需要注意的是,期望的超像素尺寸为SS,但是搜索的范围是2S*2S。
    在这里插入图片描述
  • 步骤4-距离度量。具体包括颜色和空间距离。对于每个搜索到的像素点,分别计算它到该种子点之间的距离。具体的距离公式如下所示:
    在这里插入图片描述

四、SLIC算法代码实现

# coding=utf-8
# 导入相应的python包
import argparse
from skimage import io
import matplotlib.pyplot as plt
from skimage.segmentation import slic
from skimage.util import img_as_float
from skimage.segmentation import mark_boundaries# 设置并解析参数
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required = True, help = "Path to the image")
args = vars(ap.parse_args())# 读取图片并将其转化为浮点型
image = img_as_float(io.imread(args["image"]))# 循环设置不同的超像素组
for numSegments in (100, 200, 300):# 应用slic算法并获取分割结果segments = slic(image, n_segments = numSegments, sigma = 5)# 绘制结果fig = plt.figure("Superpixels -- %d segments" % (numSegments))ax = fig.add_subplot(1, 1, 1)ax.imshow(mark_boundaries(image, segments))plt.axis("off")# 显示结果
plt.show()

五、效果展示和分析

在这里插入图片描述
  上图展示了SLIC超像素分割算法的分割结果。上图展示了两个测试图片的效果,第1行表示的是原始的输入图片;第2行表示的是设置了100个超像素组的分割结果;第2行表示的是设置了200个超像素组的分割结果;第3行表示的是设置了300个像素的分割结果。通过上面的结果我们可以获得一些信息,即通过超像素分割我们可以将整个图像划分为含有固定个超像素组的感知块,具体如图中的黄色块所示。

六、基于超像素的边缘检测代码

%% Clean up
clear all
close all
clc%Generate image
img = imread('test.jpg');
img = double(rgb2gray(img));%Invert circle brightness
img = abs(img-1);%Blur original image with Gaussian kernel with a blur width (standard
%deviaion) of 0.9 pixels
BlurGaussian = 0.9;
G = fspecial('Gaussian',5,BlurGaussian);
img = imfilter(img,G,'replicate');%Blurring occurs from quantization and from Gaussian
BlurQuantization = 1/sqrt(12);
BlurWidth = sqrt( BlurQuantization^2 + BlurGaussian^2);%% Create mask
%Only consider edges on columns 35-50
M = true(size(img));%% Perform edge localization
%Get pixel-level edges with Sobel operator
[E] = edge(img,'sobel');%Refine to subpixel accuracy
edges = SubpixelEdge(img,E,BlurWidth,M);%% Plot results
%Show image
figure(1);
imshow(uint8(img)),hold on, axis on;
plot(edges.u,edges.v,'co')figure(2);
imshow(uint8(M)),hold on, axis on;
plot(edges.u,edges.v,'co')% p1 = [edges.u(1), edges.v(1), 0]; 
% p2 = [edges.u(100), edges.v(100), 0];
% p3 = [edges.u(500), edges.v(500), 0]; 
% p = CircleCenter(p1, p2, p3);
% 
% disp('当前圆的半径为%d', p);x=edges.u;
y=edges.v;
[R,x0,y0]=circ(x,y,edges.NumPts-1);
disp(['第一个圆的半径是: ' num2str(R),' mm' ]);
disp(['第一个圆的圆心坐标:( ' num2str(x0) ,',',num2str(y0),')']);
plot(x0, y0, 'gx');

七、基于超像素的边缘检测效果展示与分析

在这里插入图片描述
  上图展示了超像素边缘检测的结果。第1行表示的是原始的输入图像;第2行表示的是超像素检测的结果,蓝色表示超像素块,整个结果是叠加在原始图像上面的,我们可以发现超像素可以准确的检测出齿轮的边缘信息,包括它的内环和外环信息;第3行含表示的是单纯的超像素检测结果,整个结果叠加在一个全黑的图像中,中心的绿色的x表示整个圆环的中心点,上述的代码可以计算出圆环的中心和半径值,这在机器视觉领域中具有较多的应用。

八、思维扩展

  对于图中的齿轮而言,我们一般会对该齿轮的外半径、内半径、模数和齿数目比较感兴趣。那么如何通过算法来获取到这些参数,聪明的你肯定能想出一些比较好的方案。

参考资料

[1] 参考资料

注意事项

[1] 如果您对AI、自动驾驶、AR、ChatGPT等技术感兴趣,欢迎关注我的微信公众号“AI产品汇”,有问题可以在公众号中私聊我!
[2] 该博客是本人原创博客,如果您对该博客感兴趣,想要转载该博客,请与我联系(qq邮箱:1575262785@qq.com),我会在第一时间回复大家,谢谢大家的关注.
[3] 由于个人能力有限,该博客可能存在很多的问题,希望大家能够提出改进意见。
[4] 如果您在阅读本博客时遇到不理解的地方,希望您可以联系我,我会及时的回复您,和您交流想法和意见,谢谢。
[5] 本文测试的图片可以通过关注微信公众号AI产品汇之后找我索取!
[6] 本人业余时间承接各种本科毕设设计和各种小项目,包括图像处理(数据挖掘、机器学习、深度学习等)、matlab仿真、python算法及仿真等,有需要的请加QQ:1575262785详聊!!!


http://chatgpt.dhexx.cn/article/omYDYSAS.shtml

相关文章

基于Matlab的SLIC超像素分割算法分析

SLIC超像素分割算法分析 1:导入原始照片,初始化聚类中心,按照设定的超像素个数,在图像内均匀的分配聚类中心。假设图片总共有 N 个像素点,预分割为 s 个相同尺寸的超像素,那么每个超像素的大小为N/ s &…

超像素分割算法————综述

参考:超像素—学习笔记 什么是超像素?评价标准?SLIC、SEED、ETPS算法 比较的指标:图像边界的粘附性、算法速度、存储效率、分割性能 超像素算法:将像素组合成感知有意义的原子区域( atomic regions),其可…

超像素分割 SLIC算法 使用示例

参考博客 介绍超像素分割 & SLIC算法 SLIC超像素分割详解(一):简介_计算机视觉life的博客-CSDN博客_slic超像素分割 机器学习:simple linear iterative clustering (SLIC) 算法_Matrix_11的博客-CSDN博客_简单线性迭代聚类…

图像处理: 超像素(superpixels)分割 SLIC算法

原理 超像素概念是2003年Xiaofeng Ren提出和发展起来的图像分割技术,是指具有相似纹理、颜色、亮度等特征的相邻像素构成的有一定视觉意义的不规则像素块。它利用像素之间特征的相似性将像素分组,用少量的超像素代替大量的像素来表达图片特征,很大程度上降低了图像…

超像素SLIC算法源码阅读

超像素SLIC算法源码阅读 超像素SLIC算法源码阅读SLIC简介源码阅读实验结果其他超像素算法对比 超像素SLIC算法源码阅读 SLIC简介 SLIC的全称Simple Linear Iterative Clustering,即简单线性迭代聚类,论文和代码链接如下: 论文传送门&#x…

python 超像素分割

SILC算法超像素分割(源码实现) 主体代码来自github.com/laixintao/slic-python-implementation 原代码中只有分割之后的小方块 即1.png 没有明显边界 没有继续进行图像分割 源码修改: 1.向Cluster类添加了label属性,以便于标记…

超像素分割学习笔记

学习目标 掌握超像素分割的原理、超像素分割方法的推导过程以及实现方法 1.1 超像素 超像素是指将具有相似纹理、颜色、亮度等特征的相邻像素聚合成某一个像素块,结合超像素的思想,这样可以使少量的像素块代替原本大量的像素。 目前超像素广泛应用于图…

SLIC超像素算法

原文出自:https://blog.csdn.net/Fighting_Dreamer/article/details/77170859 SLIC与目前最优超像素算法的比较 Radhakrishna Achanta, Appu Shaji, Kevin Smith, Aurelien Lucchi, Pascal Fua, and Sabine Susstrunk 摘要 近年来,计算机视觉应用越来…

超像素池化全监督语义分割

Efficient semantic image segmentation with superpixel pooling 摘要 在这项工作中,我们评估了超像素池化层在深层网络结构中用于语义分割的应用。超像素池化是一种灵活有效的方法,可以替代其他包含空z间先验信息的池策略。我们提出了一个简单而高效…

SLIC超像素分割算法

SLIC超像素分割算法 《SLIC Superpixels》 摘要 超像素在计算机视觉应用中越来越受欢迎。然而,很少有算法能够输出所需数量的规则、紧凑的超级像素,并且计算开销低。我们介绍了一种新的算法,将像素聚类在组合的五维颜色和图像平面空间中&a…

matlab 超像素合并,超像素区域合并

应广大学术同行的请求,将以往研究的一些代码进行整理,特发布一个学术版本的小软件工具:SuperpixelMerge, 基本功能:实现超像素的区域合并 参数说明:共7个参数,分别为图像路径、超像素分割标记图像路径、输出结果路径、合并准则、合并后区域个数、形状参数、紧凑度参数。详…

超像素—学习笔记

文章目录 概念超像素判别条件超像素初始化的方法超像素算法SLIC算法 参考资料 概念 超像素由一系列位置相邻且颜色、亮度、纹理等特征相似的像素点组成的小区域。这些小区域大多保留了进一步进行图像分割的有效信息,且一般不会破坏图像中物体的边界信息。 超像素是…

超像素采样网络(英伟达)

Superpixel Sampling Networks 摘要 超像素为图像数据提供了一种高效的低/中层次的表示,大大减少了后续视觉任务的图像基元数量。现有的超像素算法是不可微的,这使得它们很难集成到其他端到端可训练的深度神经网络中。我们开发了一种新的超像素采样可微…

超像素、语义分割、实例分割、全景分割

图像分割(Image segmentation)就是根据某些规则把图像中的像素分成不同的部分(打上不同的标签)。 1. 超像素(superpixels) 超像素并不是在普通的像素基础上继续像微观细分,恰恰相反的是&#…

超像素

《超像素》   超像素是一种以聚类思想为初衷的方法,目的是为了对较大像素的图像进行区域划分,来帮助理解,本文介绍了一个开源项目在火灾检测场景使用超像素,比较巧妙,虽然效果不是很理想,但是提供了一个…

超像素学习笔记(1)——概念及判别条件

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、超像素的概念二、超像素判别条件:一般参考三个指标1.Undersegmentation Error(UE)——欠分割误差2.Boundary Recall&…

超像素(superpixel)——SLIC和深度学习法

定义 可以理解成在图像上做的聚类问题。超像素的做法是将感知上相似的像素组在一起,称为一个超像素,以此来提供图像数据的紧凑表示。然后在后续的处理,处理单位就变成了超像素,而不是我们常用的像素。 一般超像素的结果可以为下…

学习笔记4:ubuntu常用命令

cd //打开路径cd.. //回到上一级目录cd ~ //回到主目录ls //列表touch demo.c //创建一个“demo.c”文件mkdir project //创建一个“project”文件夹vi . //进入当前目录删除文件 pwd //显示当前路径ifconfig //查看本机IP地址mv 文件名 /PATH //移动文件到某一目…

Ubuntu常用命令(持续更新)

Ubuntu常用命令(持续更新) 检查更新并升级切换至root账号修改root账号密码下载文件命令wget,举例:安装.deb文件(在文件所在目录打开终端)查看本机ip地址(注意和windows系统的区别ipconfig&#…

Ubuntu常用命令 (超详细版)

1.切换到 root 用户 ,输入 “sudo -i ”, 退出 “exit” pwd 显示当前目录, pwd print working directory ls 列出目录下当前文件 cp 复制文件/目录 cp (源文件或目录) (目标文件或目录) cp -r 复制文件夹 包括子目录和文件 r…