有很多方法可以做到这一点.您如何选择这取决于您是否重视速度和简单性或感知均匀性.如果你需要它是真正统一的,你需要用颜色配置文件定义RGB颜色,你需要配置文件的原色,这样你就可以转换为XYZ,然后转换到LAB,你可以操作L通道.
大多数情况下,您不需要这样做,而是可以使用像Photoshop一样的简单HSB模型.
要做到这一点,您只需想象一下RGB点与3D空间中的白点之间的线,并沿着该线移动颜色.实际上,您可以为该线创建参数方程并移动参数.
import numpy as np
def lighter(color, percent):
'''assumes color is rgb between (0, 0, 0) and (255, 255, 255)'''
color = np.array(color)
white = np.array([255, 255, 255])
vector = white-color
return color + vector * percent
百分比0.0将返回相同的颜色,1.0将返回白色.之间的一切都将是相同色调的浅色调.这应该给你的结果与Photoshop的HSB实现一致,但是将取决于设备并且可能不是完全一致的.
如果你有RGB [200,100,50]并且放入.50的百分比,它应该返回RGB [227.5 177.5 152.5] Photoshop报告两者的色调为20º.
没有numpy这样做并不难,但是元素操作很方便.
根据评论进行编辑:
我并不是建议你这样做,除非你知道你真的需要这么做.但是,如果你想转换为LAB,你可以毫无困难地进行操作.最重要的是,你需要知道你的RGB数字开头的颜色空间,或者你需要对它们的含义做一些假设.由于sRGB在网络上非常标准,我会在这里假设.
转换并不困难,但很容易出错.令人高兴的是,有一个非常好的colormath模块和良好的文档:https://github.com/gtaylor/python-colormath
使用它你可以像这样在sRGB和LAB之间转换:
from colormath.color_objects import sRGBColor, LabColor
from colormath.color_conversions import convert_color
sRGB = sRGBColor(126, 126, 126, is_upscaled=True) # or between [0, 1] with out is_upscaled
lab = convert_color(sRGB, LabColor)
实验室现在是一个带有亮度通道lab.lab_l的颜色,您可以在黑色(0)和白色(100)之间上下移动.这应该比HSB在感知上更统一(但是,根据您的应用,可能还不足以保证工作).
您只需更改lab_l然后转换回:
lab.lab_l = 80
new_sRGB = convert_color(lab, color_objects.sRGBColor).get_upscaled_value_tuple()
new_sRGB现在是[198,198,198]. colormath为您处理光源和伽玛问题.