美文网首页
171.SLIC超像素区域分割

171.SLIC超像素区域分割

作者: 大龙10 | 来源:发表于2025-11-08 06:26 被阅读0次

10. 轮廓与图像分割索引

  • 区域分割之聚类方法

一、基于超像素的区域分割

  • 超像素图像分割基于依赖于图像的颜色信息及空间关系信息,将图像分割为远超于目标个数、远小于像素数量的超像素块,达到尽可能保留图像中所有目标的边缘信息的目的,从而更好的辅助后续视觉任务(如目标检测、目标跟踪、语义分割等)。

  • 超像素是由一系列位置相邻,颜色、亮度、纹理等特征相似的像素点组成的小区域,我们将其视为具有代表性的大“像素”,称为超像素。超像素技术通过像素的组合得到少量(相对于像素数量)具有感知意义的超像素区域,代替大量原始像素表达图像特征,可以极大地降低图像处理的复杂度、减小计算量。

  • 超像素分割的结果是覆盖整个图像的子区域的集合,或从图像中提取的轮廓线的集合。 超像素的数量越少,丧失的细节特征越多,但仍然能基本保留主要区域之间的边界及图像的基本拓扑。

  • 超像素一般不会破坏图像中物体的边界信息,经常用于图像分割算法的预处理,例如:跟踪,标签分类,视频前景分割,骨架提取、人体姿态估计、医学图像分割。

  • 常用的超像素分割方法有:简单线性迭代聚类(Simple Linear Iterative Clustering,SLIC)、能量驱动采样(Super-pixels Extracted via Energy-Driven Sampling,SEEDS)和线性谱聚类(Linear Spectral Clustering,LSC)。

  • 通常,使用以下标准评价超像素分割的性能:

    • 部分性( Partition):每一个像素都应该属于某一个超像素,图像由超像素组成;
    • 连通性( Connectivity):超像素中的像素应该是连通的;
    • 边界附着(Boundary Adherence):超像素的边界应该能保持图像本身的边界;
    • 紧凑、规则和平滑(Compactness, Regularity and Smoothness):在没有图像边界的情况下,超像素应该是致密的、规则的,并且显示出平滑的边界。

二、SLIC 超像素区域分割

  • SLIC 基于网格化 K-means 聚类方法,原理简单,计算复杂度为O(N),N 为像素点个数。
    SLIC 通常使用包含三个颜色分量和两个空间坐标的五维向量,例如z=[r,g,b,x,y]^T。以均匀的规则网格取样点的初始的聚类中心,用 k-means 聚类算法计算出聚类中心和边界。

  • 对彩色图像可以使用 RGB 颜色空间,也可以转化为 CIELab 或其它颜色空间。对于灰度图像,则使用灰度级与空间坐标构成的三维向量。

  • SLIC 算法能生成紧凑、近似均匀的超像素,在运算速度,物体轮廓保持、超像素形状方面具有较高的综合评价,比较符合人们期望的分割效果。

  • SLIC 的优点是:(1)生成的超像素紧凑整齐,邻域特征比较容易表达;(2)可以应用于彩色图像或灰度图像;(3)参数设置少,基本参数只有超像素数量;(4)运行速度、超像素紧凑度、轮廓保持都比较理想。

  • SLIC 具体实现步骤:
    (1)初始化种子点(聚类中心):按照设定的超像素个数均匀分配种子点。若图像共有 N 个像素,预分割为 K 个超像素,则每个超像素大小为 N/K ,相邻种子点的距离(步长)近似为 S=sqrt(N/K)。
    (2)在种子点的邻域(n=3)内重新选择种子点:计算该邻域内所有像素点的梯度值,将种子点移到该邻域内梯度最小的像素点,以避免种子点落在梯度较大的轮廓边界上。
    (3)在每个种子点周围的邻域内为每个像素点分配聚类标签(属于哪个聚类中心)。作为对 k-means 聚类的改进,SLIC 将搜索范围从整幅图像缩小到 2S*2S,可以加速算法收敛。
    (4)计算距离度量。对于搜索到的每个像素点,分别计算其与种子点的距离。
    (5)迭代优化种子点。理论上上述步骤不断迭代直到误差收敛,实践发现迭代 10次就可以得到较理想的效果。
    (6)增强连通性。经过上述迭代优化可能出现:出现多连通情况、超像素尺寸过小,单个超像素被切割成多个不连续超像素等,这些情况可以通过增强连通性解决。

  • SLIC 使用是欧几里德距离来度量像素点的相似度,考虑的只是像素点与聚类中心的关系,并不能反映颜色的方差,因此对于五彩斑斓的图像区域的细节处理效果比较差。

三、函数

  • OpenCV 在 ximgproc 模块提供了 cv.ximgproc.createSuperpixelSLIC 函数实现SLIC算法。
    该函数用于初始化输入图像的 SuperpixelSLIC 对象。它设置所选超级像素算法的参数,即:区域大小和标尺。它为给定图像上的未来计算迭代预先分配了一些缓冲区。对于最终结果,建议彩色图像使用一个小的3 x 3内核预处理具有少量高斯模糊的图像,并将其额外转换为CieLAB颜色空间。SLIC与SLICO和MSLIC的对比示例如下图所示。

cv.ximgproc.createSuperpixelSLIC(image[, algorithm=SLICO, region_size=10, ruler=10.0f]) → retval

参数说明:

  • image:原始图像
  • algorithm:选择算法
  • SLIC :使用所需的区域大小分割图像
  • SLICO :使用自适应紧致因子进行优化
  • MSLIC :使用流形方法进行优化
  • region_size:区域尺寸,以像素为单位的超像素大小,默认值 10
  • ruler:超像素的平滑因子,默认值 10
  • MSLIC 是对 SLIC 的优化,密集区域的超像素较小,稀疏区域的超像素较大,从而产生对内容更敏感的超像素。

四、例程

  • 11.28: SLIC 超像素区域分割
# 11.28 SLIC 超像素区域分割
# 注意:本例程需要 opencv-contrib-python 包的支持
img = cv2.imread(r"E:/OpenCV/barbara.bmp", flags=1)  # 读取彩色图像(BGR)
imgHSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV_FULL)  # BGR-HSV 转换

# SLIC 算法
slic = cv2.ximgproc.createSuperpixelSLIC(img, region_size=10, ruler=10.0)  # 初始化 SLIC
slic.iterate(10)  # 迭代次数,越大效果越好
label_slic = slic.getLabels()  # 获取超像素标签
number_slic = slic.getNumberOfSuperpixels()  # 获取超像素数目
mask_slic = slic.getLabelContourMask()  # 获取 Mask,超像素边缘 Mask==1
mask_color = np.array([mask_slic for i in range(3)]).transpose(1, 2, 0)  # 转为 3 通道
# mask_color= cv2.COLOR_GRAY2RGB(mask_slic)  # 灰度 Mask 转为 RGB
img_slic = cv2.bitwise_and(img, img, mask=cv2.bitwise_not(mask_slic))  # 在原图上绘制超像素边界
imgSlic = cv2.add(img_slic, mask_color)

plt.figure(figsize=(9, 7))
plt.subplot(221), plt.axis('off'), plt.title("Origin image")
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))  # 显示 img(RGB)
plt.subplot(222), plt.axis('off'), plt.title("SLIC mask")
plt.imshow(mask_slic, 'gray')
plt.subplot(223), plt.axis('off'), plt.title("SLIC image")
plt.imshow(cv2.cvtColor(img_slic, cv2.COLOR_BGR2RGB))
plt.subplot(224), plt.axis('off'), plt.title("SLIC image")
plt.imshow(cv2.cvtColor(imgSlic, cv2.COLOR_BGR2RGB))
plt.tight_layout()
plt.show()

五、资料

youcans_的博客:
https://blog.csdn.net/youcans/article/details/124576469
```



相关文章

  • 超像素(Superpixels)

    超像素(Superpixels) 超像素是外观相似的一组相连像素。超像素分割将图像划分为数百个不重叠的超像素(而不...

  • SLIC超像素分割详解(一):简介

    SLIC超像素分割详解(一) 超像素概念是2003年Xiaofeng Ren提出和发展起来的图像分割技术,是指具有...

  • SLIC超像素分割

    SLIC(simple linear iterativeclustering) ,即简单线性迭代聚类。将彩色图像转...

  • SLIC超像素分割

    在计算机视觉领域里,图像分割(Segmentation)是指将数字图像分割成一些列像素集合的过程。这些集合也被成为...

  • 2.1 Core - 图像基本操作

    目标 访问像素值并修改它们 访问图像属性 设置图像区域(ROI) 分割和合并图像 访问和修改像素值 您可以通过像素...

  • OpenCV-Python学习(六):图像的基本操作

    目标: 访问像素值并修改它们 访问图像属性 设置感兴趣区域(ROI) 分割和合并图像 一、访问像素值并修改它们 二...

  • 论文泛读:《Automatic Skin Lesion Segm

    简 介: 超像素合并算法 (superpixel merging)用于皮肤组织分割, 做到了 非深度方法 中的 ...

  • DeepLab相关文献

    工程链接 Semantic Segmentation 语义分割: 即图像像素级别的分类将图像分块,每一个区域代表有...

  • SLIC 超像素分割(C++)

    摘要: SLIC:simple linear iterative clustering,简单的线性迭代聚类,它使用...

  • OpenCV-10-轮廓

    1 摘要 尽管如Canny边缘检测器等算法能够用于寻找图像中分割不同区域的边缘像素,但是这些算法并未将这些边缘像素...

网友评论

      本文标题:171.SLIC超像素区域分割

      本文链接:https://www.haomeiwen.com/subject/prvcfstx.html