Python实现超像素分割

15 篇文章 7 订阅

一、什么是超像素?

  超像素概念是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详聊!!!

  • 30
    点赞
  • 234
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值