我想将像素的颜色淡化为白色,但显然保持相同的颜色。如果我有一个像素 (200,120,40)
,将向每个值添加 10 以使 (210,130,50)
使其颜色相同,只是更亮,或者它会完全改变颜色?例如,我知道 (100,100,100)
到 (110,110,110)
是灰度渐变。我希望 RGB 值也一样,并且我想按照指示以数字方式进行。有方程式吗?
最佳答案
有很多方法可以做到这一点。您选择如何做将取决于您是否重视速度和简单性或感知一致性。如果您需要它真正统一,您将需要使用颜色配置文件定义 RGB 颜色,并且您需要配置文件的原色,以便您可以转换为 XYZ,然后转换为可以操作 L channel 的 LAB。
大多数时候您不需要这样做,您可以使用简单的 HSB 模型,就像 Photoshop 在信息面板中所做的那样。
要做到这一点,您只需想象 3D 空间中 RGB 点和白点之间有一条线,然后沿着该线移动颜色。实际上,您只需为该线创建一个参数方程并移动参数即可。
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 在 Web 上是非常标准的,因此我将在此处假设。
转换并不难,但很容易出错。令人高兴的是,有一个非常漂亮的颜色模块和很好的文档: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 现在是一种带有亮度 channel 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 为您处理了光源和 Gamma 问题。
关于python - 如何褪色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28015400/