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

如何在Python中获取每个SLIC超像素的质心?

获取SLIC超像素的质心坐标

嘿,作为经常用skimage处理超像素的开发者,我来给你拆解怎么拿到每个超像素的质心~你已经用segments = slic(image, n_segments=numSegments, sigma=1, convert2lab=True)得到了超像素分割结果,接下来只需要对每个超像素的像素坐标求均值就行,具体步骤如下:

核心思路

segments是一个和输入图像尺寸完全一致的数组,每个位置的数值代表该像素所属的超像素标签。质心其实就是某个超像素下所有像素坐标的平均值(因为每个像素权重相同)。

完整代码实现

首先确保你导入了需要的库:

import numpy as np
from skimage.segmentation import slic
from skimage.io import imread
import matplotlib.pyplot as plt

然后跟着步骤来:

  1. 先读取图像并完成超像素分割(你已经写了这部分,这里再贴一遍方便连贯):
# 读取示例图像
image = imread("your_image.jpg")
numSegments = 100  # 你设定的超像素数量
segments = slic(image, n_segments=numSegments, sigma=1, convert2lab=True)
  1. 获取所有唯一的超像素标签,遍历每个标签计算质心:
# 获取所有不重复的超像素标签
unique_labels = np.unique(segments)

# 存储每个超像素的质心,格式可以是字典{标签: (x, y)}或者列表
centroids = {}

for label in unique_labels:
    # 找到当前标签下所有像素的坐标(注意:segments的形状是(H, W),所以坐标是(row, col),对应图像的(y, x))
    y_coords, x_coords = np.where(segments == label)
    
    # 计算质心坐标:取所有x的均值和y的均值
    centroid_x = np.mean(x_coords)
    centroid_y = np.mean(y_coords)
    
    # 把质心存入字典,标签作为键
    centroids[label] = (centroid_x, centroid_y)
  1. (可选)可视化验证:把质心画在原图上,确认位置是否合理
plt.figure(figsize=(10, 10))
plt.imshow(image)
for label, (cx, cy) in centroids.items():
    # 用红色圆点标记质心,大小可以调整
    plt.scatter(cx, cy, c='red', s=20)
plt.axis('off')
plt.show()

注意事项

  • 坐标顺序:np.where返回的是(行索引, 列索引),对应图像的y轴和x轴,所以如果需要和OpenCV的(x, y)格式一致,要把centroid_x(列均值)放前面,centroid_y(行均值)放后面,这点别搞混哦~
  • 如果你的图像是灰度图,代码完全通用,因为segments的生成逻辑和彩色图一样。
  • 如果你不需要标签对应关系,也可以直接把所有质心存在一个列表里,比如centroid_list = [(np.mean(x_coords), np.mean(y_coords)) for label in unique_labels]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:03:17