You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于skimage.segmentation.slic返回超像素数与n_segments不符的问询

为什么skimage.segmentation.slic返回的超像素数量与n_segments参数不一致?

在使用skimage.segmentation.slic时,发现返回的超像素数量和设定的n_segments参数不匹配,API文档说明该参数是近似值,以下是导致这种现象的核心原因:

复现代码

from skimage.segmentation import slic
import numpy as np
from torchvision import datasets
dataset = datasets.MNIST(root='../dataset', train=True, download=False)

n_segments = 50
for i in range(len(dataset)):
    segments = slic(dataset[i][0], n_segments=50, compactness=0.25)
    n_sp = len(np.unique(segments))
    print('image={}/{}, n_sp={}'.format(i + 1, len(dataset), n_sp))

输出片段

image=3938/60000, n_sp=41
image=3939/60000, n_sp=41
image=3940/60000, n_sp=43
image=3941/60000, n_sp=44
image=3942/60000, n_sp=42
image=3943/60000, n_sp=44
image=3944/60000, n_sp=41
image=3945/60000, n_sp=46
image=3946/60000, n_sp=44
image=3947/60000, n_sp=43
image=3948/60000, n_sp=44
image=3949/60000, n_sp=42
image=3950/60000, n_sp=43
image=3951/60000, n_sp=41
image=3952/60000, n_sp=42
image=3953/60000, n_sp=44
image=3954/60000, n_sp=43
image=3955/60000, n_sp=48
image=3956/60000, n_sp=47
image=3957/60000, n_sp=45
image=3958/60000, n_sp=44
image=3959/60000, n_sp=45
image=3960/60000, n_sp=42
image=3961/60000, n_sp=43
image=3962/60000, n_sp=46
image=3963/60000, n_sp=47
image=3964/60000, n_sp=46

核心原因解析

  • 初始化阶段的近似性:SLIC会先通过图像总像素数 / n_segments计算每个超像素的近似大小,然后在图像上按网格均匀初始化聚类中心,但会自动跳过边缘或低梯度的区域(避免把中心放在噪声或无意义的位置)。如果图像宽高和超像素近似大小无法整除,或者初始化时跳过了部分点,初始中心数量就会和n_segments有偏差。
  • 聚类过程的动态调整:迭代优化时,算法会自动合并面积远小于平均大小的超像素,同时在纹理/颜色变化剧烈的区域(比如MNIST的笔画边缘)分裂出更多超像素。最终数量会根据图像内容的复杂度自然波动,不会严格卡死在设定值上。
  • Compactness参数的放大效应:你设置的compactness=0.25数值很小,这个参数控制超像素的形状规整度——值越小,算法越优先匹配图像的纹理和颜色边界,而不是保持规整的网格形状,这会进一步加剧超像素数量的波动。如果增大该值(比如设为10),超像素会更接近规整的方块,数量也会更接近n_segments。

内容的提问来源于stack exchange,提问作者user17349469

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 11:57:34