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

基于颜色分割图像:用OpenCV和Python提取k-means聚类后的单颜色图像

当然可以实现!用OpenCV结合Python完全能满足你的需求——把K-means聚类得到的三类颜色分别提取出来,生成各自独立的图像。下面我给你一步步拆解实现方法,附完整的可运行代码:

核心思路

本质是通过**掩码(Mask)**标记每个聚类对应的像素区域,然后保留该区域的像素、屏蔽其他区域,最终生成单类别的独立图像。如果需要像示例那样的“纯元素+透明背景”效果,还可以给图像添加Alpha通道实现透明化。

完整实现步骤

1. 先确保你有K-means的聚类结果

假设你已经完成了K-means聚类,得到了两个关键变量:

  • labels:形状为(图像高度, 图像宽度)的数组,每个元素是对应像素的聚类标签(0、1、2,对应3类)
  • centers:形状为(3, 3)的数组,每个元素是对应聚类的BGR颜色值(OpenCV默认颜色空间)

如果还没做K-means,这里给你快速实现的代码片段:

import cv2
import numpy as np

# 读取原始图像
original_img = cv2.imread("your_input_image.png")
# 转换为RGB格式(可选,聚类也可以直接用BGR)
img_rgb = cv2.cvtColor(original_img, cv2.COLOR_BGR2RGB)
# 将图像重塑为像素列表(K-means需要的输入格式)
pixels = img_rgb.reshape((-1, 3)).astype(np.float32)

# 设置K-means参数
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 100, 0.2)
k = 3  # 你设置的聚类数
_, labels, centers = cv2.kmeans(pixels, k, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS)

# 整理结果:将标签重塑为图像尺寸,颜色值转回uint8并转换回BGR
labels = labels.reshape((original_img.shape[0], original_img.shape[1]))
centers = np.uint8(centers)
centers_bgr = cv2.cvtColor(centers.reshape(1, 3, 3), cv2.COLOR_RGB2BGR).reshape(3, 3)

2. 提取单个聚类区域生成独立图像

这里提供两种方案,按需选择:

方案1:生成带纯色背景的图像

适合需要固定背景的场景,比如把目标元素放在黑色/白色背景上:

h, w = original_img.shape[:2]

for cluster_idx in range(3):
    # 生成掩码:当前聚类的像素标记为255,其他为0
    mask = np.where(labels == cluster_idx, 255, 0).astype(np.uint8)
    
    # 复制原图像,将非目标区域设为黑色背景
    result_img = original_img.copy()
    result_img[mask == 0] = [0, 0, 0]  # BGR格式的黑色,也可以换成[255,255,255]白色
    
    # 保存图像
    cv2.imwrite(f"cluster_{cluster_idx}_solid_bg.png", result_img)

方案2:生成带透明背景的图像

完美匹配你示例中的需求(比如单独提取蓝色方块、字母v):

for cluster_idx in range(3):
    # 生成掩码
    mask = np.where(labels == cluster_idx, 255, 0).astype(np.uint8)
    
    # 将原图像转换为RGBA格式(新增Alpha通道控制透明度)
    rgba_img = cv2.cvtColor(original_img, cv2.COLOR_BGR2RGBA)
    # 非目标区域的Alpha通道设为0(完全透明)
    rgba_img[mask == 0, 3] = 0
    
    # 保存透明背景图像(必须用PNG格式,JPG不支持透明)
    cv2.imwrite(f"cluster_{cluster_idx}_transparent.png", rgba_img)
关键细节说明
  • 如果你在K-means聚类时用的是RGB空间,记得把颜色值转换回BGR再和OpenCV交互,避免颜色显示偏差
  • 透明背景图像必须保存为PNG格式,JPEG不支持Alpha通道,会丢失透明效果
  • 可以通过查看centers_bgr的值,提前确定哪个聚类对应蓝色方块、哪个对应字母v,这样就能精准命名输出文件

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:38:29