如何在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
然后跟着步骤来:
- 先读取图像并完成超像素分割(你已经写了这部分,这里再贴一遍方便连贯):
# 读取示例图像 image = imread("your_image.jpg") numSegments = 100 # 你设定的超像素数量 segments = slic(image, n_segments=numSegments, sigma=1, convert2lab=True)
- 获取所有唯一的超像素标签,遍历每个标签计算质心:
# 获取所有不重复的超像素标签 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)
- (可选)可视化验证:把质心画在原图上,确认位置是否合理
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
相关产品推荐
相关产品推荐

