如何修改代码将图片提取的十六进制主色转为颜色名称并输出至指定列
代码修改方案:十六进制转颜色名称并输出到指定Excel列
核心实现步骤
- 构建十六进制颜色值与常用颜色名称的映射表,覆盖基础颜色(可按需扩展)
- 编写转换函数,将提取到的十六进制颜色匹配为对应名称,兼容大小写差异
- 使用
pandas将结果写入Excel的“提取颜色”列
修改后的完整代码
import cv2 import numpy as np from PIL import Image from sklearn.cluster import KMeans import pandas as pd # 十六进制颜色到中文名称的映射(可根据需求补充更多颜色) HEX_COLOR_MAP = { "#ff0000": "红", "#00ff00": "绿", "#0000ff": "蓝", "#000000": "黑", "#ffffff": "白", "#ffff00": "黄", "#ff00ff": "洋红", "#00ffff": "青", "#800000": "深红", "#008000": "深绿", "#000080": "深蓝", "#808080": "灰", "#800080": "紫", "#808000": "橄榄", "#c0c0c0": "银灰" } def hex_to_name(hex_str): """将十六进制颜色转为中文名称,匹配失败时返回原十六进制值""" return HEX_COLOR_MAP.get(hex_str.lower(), hex_str.lower()) def get_dominant_colors(img_path, top_n=5): # 读取并预处理图片 img = cv2.imread(img_path) img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) img_flat = img_rgb.reshape((img_rgb.shape[0] * img_rgb.shape[1], 3)) # KMeans聚类提取主色 kmeans = KMeans(n_clusters=top_n) kmeans.fit(img_flat) # RGB转十六进制 hex_colors = [] for rgb in kmeans.cluster_centers_.astype(int): hex_str = f"#{rgb[0]:02x}{rgb[1]:02x}{rgb[2]:02x}" hex_colors.append(hex_str) # 转换为颜色名称 return [hex_to_name(h) for h in hex_colors] # 提取Photo1.jpg的主色名称 color_names = get_dominant_colors("Photo1.jpg", top_n=5) # 写入Excel的“提取颜色”列 df = pd.DataFrame({"提取颜色": color_names}) df.to_excel("主色提取结果.xlsx", index=False) print("结果已写入Excel文件的'提取颜色'列")
关键细节说明
- 映射表扩展:如果需要匹配更多颜色,直接在
HEX_COLOR_MAP中添加对应的十六进制值和名称即可 - 容错处理:转换函数会自动将十六进制转为小写,避免大小写不一致导致的匹配失败,匹配不到的颜色会保留原十六进制值
- Excel输出:依赖
pandas库,若未安装可通过pip install pandas openpyxl安装(openpyxl是写入xlsx的依赖)
进阶优化方向
- 若需要更精准的颜色匹配,可替换精确映射为RGB距离计算:计算提取的RGB值与标准颜色RGB的欧氏距离,取最近的颜色名称
- 调整
top_n参数可以控制提取的主色数量
内容的提问来源于stack exchange,提问作者user20649218
相关产品推荐
相关产品推荐

