当前位置: 首页 > 面试题库 >

在其他两种颜色之间寻找颜色的算法-在绘画颜色的颜色空间中

闽朝
2023-03-14
问题内容

当混合蓝色和黄色油漆时,结果是某种绿色。

我有两种rgb颜色:

蓝色=(0,0,255)

黄色=(255,255,0)

找到两种颜色混合使用时产生的rgb颜色的算法是什么(就像使用油漆时会出现的一样)?该算法产生的颜色不必十分精确。对于上面的示例,它只需要看起来像某种绿色即可。

提前致谢。

编辑: 根据LaC的回答,用Go编写的此功能对我有用。

func paintMix(c1, c2 image.RGBAColor) image.RGBAColor { 
    r := 255 - ((255 - c1.R) + (255 - c2.R))
    g := 255 - ((255 - c1.G) + (255 - c2.G))
    b := 255 - ((255 - c1.B) + (255 - c2.B))
    return image.RGBAColor{r, g, b, 255}
}

编辑#2 虽然如此,但设法将青色和黄色混合,蓝色和黄色之间的混合变为黑色,这似乎不太正确。我仍在寻找有效的算法。

编辑#3 这是Go中使用HLS颜色空间的完整工作示例:http :
//go.pastie.org/1976031。谢谢马克·兰瑟姆。

编辑#4 似乎更好的混色方法是使用Kubelka-Munk方程


问题答案:

油漆通过吸收起作用。首先从白光(255,255,255)乘以吸收系数。

蓝色颜料吸收了所有击中它的红色和绿色光。

黄色油漆吸收了所有击中它的蓝光。

在一个理想的世界中,这意味着将黄色和蓝色的油漆混合会产生黑色的油漆,或至多是浑浊的灰色。实际上,“蓝色”涂料偏向绿色,因此您会得到浑浊的绿色。我从未见过将黄色和蓝色混合产生令人满意的绿色的示例。Wikipedia讨论了此过程的一些复杂性:http
:
//en.wikipedia.org/wiki/Primary_color#Subtractive_primaries

我认为您真正要问的是如何沿着色轮插入颜色。这应该与颜色是吸收性的(如涂料中的)还是发射性的(如RGB显示器中的)无关。

编辑:
通过在HSL颜色空间中工作,您可以获得所需的结果。这是一些实现该算法的Python代码;平均色调是棘手的,并且基于我先前对平均角度的回答。

from colorsys import rgb_to_hls,hls_to_rgb
from math import sin,cos,atan2,pi

def average_colors(rgb1, rgb2):
    h1, l1, s1 = rgb_to_hls(rgb1[0]/255., rgb1[1]/255., rgb1[2]/255.)
    h2, l2, s2 = rgb_to_hls(rgb2[0]/255., rgb2[1]/255., rgb2[2]/255.)
    s = 0.5 * (s1 + s2)
    l = 0.5 * (l1 + l2)
    x = cos(2*pi*h1) + cos(2*pi*h2)
    y = sin(2*pi*h1) + sin(2*pi*h2)
    if x != 0.0 or y != 0.0:
        h = atan2(y, x) / (2*pi)
    else:
        h = 0.0
        s = 0.0
    r, g, b = hls_to_rgb(h, l, s)
    return (int(r*255.), int(g*255.), int(b*255.))

>>> average_colors((255,255,0),(0,0,255))
(0, 255, 111)
>>> average_colors((255,255,0),(0,255,255))
(0, 255, 0)

请注意,这个答案并 没有 效仿调漆,为上述原因。相反,它提供了直观的颜色混合,这是任何现实世界中都不存在的。



 类似资料:
  • 我使用下面的POV-Ray循环在其他颜色空间绘制sRGB坐标。环路只沿着外表面产生点,然后用三角形连接它们。因为sRGB空间是一种扭曲的立方体,这意味着6个外表面和8个顶点。 这很有效,因为几乎所有的颜色空间都是三维的。以下是一个输出示例: 不过,我想对CMYK颜色空间也这么做。我遇到的问题是,它有4个参数,而不是3个。同样,我只想在最外面的曲面上绘制点,并用三角形连接它们。我不认为产生的颜色立体

  • 问题内容: 我想根据百分比值计算颜色: 我该如何计算最后一件事?如果黄色出现在50%处就可以了。 我尝试了这个: 好吧,这行得通,但是我希望将50%左右的颜色在灰色背景上使用时会更浅一些。我该如何做到这一点? 谢谢! UPDATE 我试图将转换为YUV就像是在意见建议。但我仍然遇到同样的问题,即50%的天黑了。另外,在此解决方案中,我现在的白色为<5%。如果我不进行计算,只是稍微好一点,但是在<2

  • 原文:Specifying Colors 在 matplotlib 的几乎所有地方,用户都可以指定颜色,它可以以如下形式提供: RGB 或者 RGBA 浮点值元组,[0, 1]之间,例如(0.1, 0.2, 0.5)或者(0.1, 0.2, 0.5, 0.3)。 RGB 或者 RGBA 十六进制字符串,例如#0F0F0F或者#0F0F0F0F。 [0, 1]之间的浮点值的字符串表示,用于表示灰度,

  • 用法 这是一个基于 material design 基础颜色的调色板。每一种颜色的定义有一个基本的颜色类和一个可选的减轻或变暗的类。 背景颜色 应用一个背景颜色只需要增加颜色的名称和颜色深浅度到元素的 class 属性中。这是一个卡片面板带一个 teal、lighten-2 类。 <div class="card-panel teal lighten-2">这是一个卡片面板带一个 teal lig

  • 在前面的教程中我们已经简要提到过该如何在OpenGL中使用颜色(Color),但是我们至今所接触到的都是很浅层的知识。本节我们将会更深入地讨论什么是颜色,并且还会为接下来的光照(Lighting)教程创建一个场景。 现实世界中有无数种颜色,每一个物体都有它们自己的颜色。我们需要使用(有限的)数值来模拟真实世界中(无限)的颜色,所以并不是所有现实世界中的颜色都可以用数值来表示的。然而我们仍能通过数值

  • 实现可视化要经常和颜色打交道。虽然你的电脑显示屏懂得很多的颜色,但这对通过js来配置颜色帮助不大。所以d3提供多种颜色空间的表示,包括 RGB, HSL,LAB 和 HCL,可实现规范、插值、转换和操作(例如颜色的明暗)。 注意:虽然你可以直接操作颜色,当时也需要参考一下D3对于interpolateRgb, interpolateHsl 和 scales等内置颜色插值的实现。 如果你想查阅调色盘