python - 如何褪色

标签 python image image-processing colors pixel

我想将像素的颜色淡化为白色,但显然保持相同的颜色。如果我有一个像素 (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/

相关文章:

python - 如何使用 getMouse() 捕获右键单击事件

python - 使用 Django 时如何处理 mqtt loop_forever 函数?

python - 如何使用 python 和 pandas 获取特定索引处的列名称并将其打印到另一列中

objective-c - 如何在 UIImageView 中创建大图像?

asp.net - 如何停止缓存图像 - 或者 - 如何检查服务器上是否存在文件?

image - 图像的零填充傅里叶

python - 将数据添加到 numpy 数组的新维度中

python - 从 POST 解码 base64 以在 PIL 中使用

xcode - 比较 iOS 8 中的 ImageView 不起作用

php - 如何序列化 svg 以便它可以放入 cookie