如何在Python中实现基于墨水量权重的颜色加权求和?
实现以墨水量权重为基准的颜色混合
问题原因
RGB是加色模式(基于光的叠加,数值越高颜色越亮,白色为(1,1,1),黑色为(0,0,0)),而墨水混合属于减色模式(基于颜料吸收光,墨水用量越少,反射的光越多,颜色越接近白色)。直接在RGB空间加权求和,本质是叠加少量光色,自然会得到接近黑色的结果。
解决方案
要实现墨水量权重的混合,需从白色(无墨水状态)出发,计算每种墨水对光的吸收量,最终RGB值为白色减去总吸收量:
- 每个RGB通道的总吸收量 = 所有墨水的权重 × 该墨水对当前通道的吸收比例(吸收比例 = 1 - 该墨水在当前通道的RGB值)
- 最终通道值 = 1 - 总吸收量
代码实现
import numpy as np import matplotlib.colors as colors palette = [(1,0,0),(0,1,0),(0,0,1)] weight = (0.1,0.1,0.1) # 转换为numpy数组简化计算 palette_np = np.array(palette) weight_np = np.array(weight) # 计算每个RGB通道的总吸收量 absorbed = np.sum(weight_np[:, np.newaxis] * (1 - palette_np), axis=0) # 计算混合后的RGB颜色 mixed_colors = 1 - absorbed print(colors.to_hex(mixed_colors)) # 输出 #cccccc,接近白色
补充说明
如果调色板包含非纯原色(比如(0.5,0,0)的浅红色墨水),上述逻辑依然适用:该墨水对G/B通道的吸收比例为1-0=1,对R通道的吸收比例为1-0.5=0.5,用量权重w时,会吸收w*0.5的R光、w*1的G/B光。
内容的提问来源于stack exchange,提问作者Algorithman
相关产品推荐
相关产品推荐

