K-means聚类:如何匹配OpenCV返回的centers数组各值对应的颜色
解决方案
- 你代码里
cent = centers.sort()存在逻辑问题:numpy.ndarray.sort()是原地排序方法,没有返回值,所以你打印的cent实际为None,你输出的左上角数值不是正确的聚类中心列表。
cv2.kmeans返回的centers数组和labels的类别编号是严格一一对应的:
- 标签值为
0的所有像素,对应的聚类中心就是centers[0] - 标签值为
1的所有像素,对应的聚类中心就是centers[1] - 以此类推直到
k-1类
你代码里生成分割图的逻辑segmented_image = centers[labels.flatten()]本身就用了这个对应规则,所以每个centers[i]的数值,就是分割后第i类的像素通道值,也就是这个类对应的颜色数值。
你可以用下面两种方法直观查看对应关系:
方法1:直接打印对应关系
在得到centers和labels后遍历输出即可:
unique_labels = np.unique(labels) for label in unique_labels: print(f"类别编号{label},对应像素值:{centers[label]},对应颜色通道数值即为此数组")
方法2:可视化每个类别对应的纯色块+数值标注
生成每个类别的纯色小图和数值一同显示,就能直观对照:
block_size = 50 fig, axes = plt.subplots(1, k, figsize=(k*2, 2)) for i in range(k): # 生成对应颜色的纯色块 color_block = np.full((block_size, block_size, 2), centers[i], dtype=np.uint8) axes[i].imshow(color_block) axes[i].set_title(f"类别{i}\n值:{centers[i]}") axes[i].axis('off') plt.show()
如果需要和你分割图显示的颜色完全对应,保证显示色块和显示分割图时用的cmap参数一致即可。
内容的提问来源于stack exchange,提问作者Savannah
相关产品推荐
相关产品推荐

