有很多方法可以做到這一點.您如何選擇這取決于您是否重視速度和簡單性或感知均勻性.如果你需要它是真正統一的,你需要用顏色配置文件定義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報告兩者的色調為20o.
沒有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為您處理光源和伽瑪問題.