首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在python中执行加权的颜色和?

如何在python中执行加权的颜色和?
EN

Stack Overflow用户
提问于 2022-09-28 22:18:05
回答 2查看 40关注 0票数 0

假设我有一个n种颜色的调色板,我想把所有的颜色和分配给每种颜色的特定权重混合起来。把重量想象成我想从每种颜色中提取的墨水的百分比。为了简化,让我们使用3种原色:

代码语言:javascript
复制
palette = [(1,0,0),(0,1,0),(0,0,1)]
weight = (0.1,0.1,0.1)

自然,最少的油墨将导致较轻的颜色。因此,如果我使用10%的每种墨水,我会期望更接近白色。但在rgb配色方案中并非如此:

代码语言:javascript
复制
import numpy as np
import matplotlib.colors as colors
mixed_colors = np.sum([np.multiply(weight[i],palette[i]) for i in range(len(palette))],axis=1)
print(colors.to_hex(mixed_colors))

在这种情况下,我会得到更接近黑色的#1a1a1a。我如何执行加权和与重量代表“墨量”的每一种颜色?

现在,请忽略这样一个事实,即加权和可能导致每个rgb字段的数目大于1。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-09-28 23:03:11

问题不是颜色模型,而是关于模型和介质的假设。

用于混合的简单线性模型可能不准确,但它可能就足够了,这取决于代码的purpose

在油墨的例子中,很大一部分感觉到的颜色是你正在打印的表面,它不是颜色模型的一部分(尽管它可能是颜色配置文件的一部分)。

颜料也是减法的,而不是加性的;这可以被认为是颜色模型的一个属性。注意,RGB是加性的,这也是它不是油墨的一个好模型的原因之一。CMYK是印刷中使用最多的颜色模型,但即便如此,它也不是印刷颜色的直接表示。相反,CMYK颜色应该映射到特定于打印机、油墨和纸张的配置文件。

使用当前的实现(以及假设一个相减线性颜色模型),您将需要从白色中减去加权和。

代码语言:javascript
复制
white = np.array((1,) * 3)
# subtractive:
printed_color = white - mixed_colors

您还可以对调色板进行预处理,并将其转换为一个加法空间:

代码语言:javascript
复制
palette = [white - color for color in palette]
# or
palette = white - np.array(palette)

在屏幕上呈现的情况下,你所拥有的是通道的不透明度。在图像格式中,每个通道都有不同的层,只要设置每一层的不透明度,就可以很容易地根据需要进行混合。对于其他格式,您可以使用separate the channels,然后对每种格式应用一个不透明度。

票数 0
EN

Stack Overflow用户

发布于 2022-09-28 22:58:21

我认为你的问题是,你真正想要的是你当前计算的相反。记住,(255,255,255)在RGB中是白色的,(0,0,0)是黑色的。你是说.1的重量意味着你做了10%的颜色,但是因为接近0的颜色更深,你真的做了90%的重量。

如果你选择这样做:

代码语言:javascript
复制
import numpy as np
import matplotlib.colors as colors

palette = [(1,0,0),(0,1,0),(0,0,1)]
weight = (0.1,0.1,0.1)

mixed_colors = np.sum([np.multiply(weight[i], palette[i]) for i in range(len(palette))],axis=1)

colors_inverse = np.subtract((1, 1, 1), mixed_colors)

print(colors.to_hex(colors_inverse))

代码语言:javascript
复制
import numpy as np
import matplotlib.colors as colors

palette = [(1,0,0),(0,1,0),(0,0,1)]
weight = (0.9,0.9,0.9)

mixed_colors = np.sum([np.multiply(weight[i], palette[i]) for i in range(len(palette))],axis=1)

print(colors.to_hex(mixed_colors))

你得到了你期望的颜色,这是一种淡灰色。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73888380

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档