如何淡化色彩

use*_*er0 7 python image pixel colors image-processing

我想将像素的颜色淡化为白色,但显然保持相同的颜色.如果我有一个像素(200,120,40),将为每个值添加10,使其(210,130,50)成为相同的颜色,只是更轻,还是会完全改变颜色?例如,我知道这(100,100,100)(110,110,110)是一个灰度衰落.我希望RGB值相同,我想按数字进行,如图所示.有没有方程式这样做?

Mar*_*yer 16

有很多方法可以做到这一点.您如何选择这取决于您是否重视速度和简单性或感知均匀性.如果你需要它是真正统一的,你需要用颜色配置文件定义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
Run Code Online (Sandbox Code Playgroud)

百分比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)
Run Code Online (Sandbox Code Playgroud)

实验室现在是一种带有亮度通道的颜色lab.lab_l,您可以在黑色(0)和白色(100)之间上下移动.这应该比HSB在感知上更统一(但是,根据您的应用,可能还不足以保证工作).

您只需更改lab_l然后转换回:

lab.lab_l = 80
new_sRGB = convert_color(lab, color_objects.sRGBColor).get_upscaled_value_tuple()
Run Code Online (Sandbox Code Playgroud)

new_sRGB现在[198, 198, 198].colormath为您处理光源和伽玛问题.


Eri*_*ric 5

只需在颜色和白色之间进行线性插值:

def lerp(a, b, t):
    return a*(1 - t) + b*t

import numpy as np
white = np.array([255, 255, 255])
my_color = np.array([...])
lightened25 = lerp(my_color, white, 0.25)
Run Code Online (Sandbox Code Playgroud)

或者没有numpy:

lightened25 = [lerp(c, w, 0.25) for c, w in zip(my_color, white)]
Run Code Online (Sandbox Code Playgroud)