Python实现K-Means颜色聚类后按条件修改非最深色簇RGB值
现有代码的np.where写法逻辑错误,既没有做赋值操作,返回的索引也不符合数组筛选要求,因此无法得到预期效果。
正确实现代码
方案1:基于你现有生成的X_compressed修改
# 生成掩码:标签不等于最深色簇索引的像素位置 mask = optimial_kmeans.labels_ != hair_index # 把掩码对应位置的像素直接设为白色 X_compressed[mask] = [255, 255, 255] # 再重塑为原图像维度 result_img = X_compressed.reshape(img.shape[0], img.shape[1], 3)
方案2:更高效的直接生成方式(无需先生成全聚类压缩图)
# 先生成全白的数组,形状和拉平的rgb数组一致 result_flat = np.full_like(rgb, 255, dtype=np.uint8) # 仅把属于最深色簇的像素替换为对应质心颜色 result_flat[optimial_kmeans.labels_ == hair_index] = centroid[hair_index].astype(np.uint8) # 重塑为原图像尺寸 result_img = result_flat.reshape(img.shape[0], img.shape[1], 3)
优化建议
你当前仅通过R通道数值判断最深色的逻辑存在误差,建议改用灰度值判断,适配更多场景:
# 用标准灰度公式计算每个簇质心的灰度值 gray_centroid = 0.299 * centroid[:, 0] + 0.587 * centroid[:, 1] + 0.114 * centroid[:, 2] # 取灰度最小的簇作为最深色簇 hair_index = np.argmin(gray_centroid)
内容的提问来源于stack exchange,提问作者Crazy
相关产品推荐
相关产品推荐

