如何使用PIL实现两调色板颜色全组合并替换目标图片对应颜色
实现方案
步骤说明
- 先编写十六进制颜色码转RGB元组的工具函数,适配图片数值处理要求
- 遍历红色系调色板和黄色系调色板的全量两两组合
- 对每组颜色组合,复制原始图片数组,将对应红色像素全部替换为目标黄色像素
- 转换数组回图片对象,按照颜色组合名称命名保存
完整可运行代码
from PIL import Image import numpy as np from itertools import product # 十六进制颜色转RGB元组工具函数 def hex_to_rgb(hex_str): hex_str = hex_str.lstrip('#') return tuple(int(hex_str[i:i+2], 16) for i in (0, 2, 4)) # 读取原始图片 im = Image.open('AGXCL.jpg') imnp = np.array(im) webhexred = { "lightsalmon" : "#FFA07A", "salmon" :"#FA8072", "darksalmon" : "#E9967A", "lightcoral" : "#F08080" } webhexyel = { "goldenrod" : "#DAA520", "gold": "#FFD700", "orange" : "#FFA500", "darkorange" : "#FF8C00" } # 预转换所有调色板颜色为RGB格式 red_rgb_map = {name: hex_to_rgb(hex_code) for name, hex_code in webhexred.items()} yel_rgb_map = {name: hex_to_rgb(hex_code) for name, hex_code in webhexyel.items()} # 遍历所有颜色两两组合 for (red_name, red_rgb), (yel_name, yel_rgb) in product(red_rgb_map.items(), yel_rgb_map.items()): # 复制原始数组避免修改原数据 temp_np = imnp.copy() # 匹配所有对应红色像素并替换为目标黄色 mask = (temp_np == red_rgb).all(axis=-1) temp_np[mask] = yel_rgb # 生成图片并按命名规则保存 output = Image.fromarray(temp_np) output.save(f"{red_name}_{yel_name}.png")
注意事项
- 当前代码为精确匹配颜色替换,如果需要模糊匹配相近颜色,可以调整mask判断逻辑,改为计算颜色空间距离小于阈值即判定为匹配
- 如果处理的是带透明通道的RGBA格式图片,需要修改十六进制转码逻辑和mask判断逻辑,适配alpha通道处理
- 运行前请确认
AGXCL.jpg和代码放在同一目录,也可以修改Image.open内的路径为图片的绝对路径
内容的提问来源于stack exchange,提问作者project.py
相关产品推荐
相关产品推荐

