是否有一种颜色混合算法可以像混合真实颜色一样工作?

2023-11-26

常见的 RGB 颜色混合与绘画颜色的混合有很大不同, 它是光的混合而不是颜料的混合。

例如:

Blue (0,0,255) + Yellow (255,255,0) = Grey (128,128,128)

(应该是蓝色+黄色=绿色)

是否有任何已知的颜色混合算法可以像混合真实颜色一样工作?


我的方法

我已经尝试过以下操作:

将两种颜色转换为 HSV和混合色调(乘以根据饱和度计算的系数), 以及饱和度和价值通道的简单平均值。然后我计算了两者的平均亮度 颜色并调整生成的颜色以匹配此亮度。 这工作得很好,但色调混合有时是错误的,例如。 G。:

Red (Hue 0°) + Blue (Hue 240°) = Green (Hue 120°)

我发现有时我需要将色调值移动 360°(当 色调大于180°)。

Red (Hue 360°) + Blue (Hue 240°) = Magenta/fuchsia (Hue 300°)

但这种转变也不是很好,例如:

Cyan (Hue 179°) + Red (Hue 0°) = Hue 89.5°
Cyan (Hue 181°) + Red (Hue 0°) --> shifting is performed (the difference is greater than 180°)
Cyan (Hue 181°) + Red (Hue 360°) = Hue 270.5°

(色调 179 + 红色)和(色调 181 + 红色)会产生两种完全不同的颜色。


Then 我尝试了 CIE Lab 色彩空间(如在 Photoshop 中),其设计更接近人类感知颜色的方式。

我只对相应的两个通道使用了简单的平均值,但结果并不令人满意, 例如,我从蓝色 (98, -16, 93) 和黄色 (30, 68, -112) 中得到粉色 (64, 26, -9.5)。这些系数 取自 Photoshop。

也许如果我使用一些与平均不同的操作,它可以工作,但是 我不知道是什么。


CMYK 也不起作用,结果与 RGB 或 LAB 中的结果一样。


看起来既不是微不足道的加法,也不是微不足道的减法在任何这些颜色空间中进行颜色混合都会产生自然的结果。


工作实施

Krita – 绘画混音器

光栅图形编辑器 Krita 在某些时候实现了更真实的颜色混合:http://commit-digest.org/issues/2007-08-12/(绘画混音器插件)

他们表示,这是第一个使用库贝尔卡和芒克方程描述颜料行为的特殊技术的公共应用程序。

这是 Krita 混色的视频:https://www.youtube.com/watch?v=lyLPZDVdQiQ

五十三的论文

还有有关 iOS 版 Paper 应用程序中的颜色混合的文章由开发五十三。他们描述了他们如何在该领域进行创新和实验,并提供了混合蓝色和黄色产生绿色的样本。然而,那里并没有真正描述实际的过程或算法。

Quoting:

“在寻找良好的混合算法时,我们最初尝试在各种颜色空间之间进行插值:RGB、HSV 和 HSL,然后是 CieLAB 和 CieLUV。结果令人失望,”Chen 说道。 “我们知道红色和黄色应该产生橙色,或者红色和蓝色应该产生紫色 - 但无论您使用什么颜色空间,都没有任何方法可以得到这些颜色。有一条工程公理:做最简单的事情可能可行。好吧,我们现在已经尝试了最简单的方法,但他们感觉不太对。”

看起来和 Krita 一样,Paper 实现了 Kubelka-Munk 模型:

[...] Kubelka-Munk 模型的每种颜色至少有 6 个值,包括每种 RGB 颜色的反射和吸收值。 “虽然屏幕上颜色的外观可以在三维空间中描述,但颜色的混合实际上是在六维空间中发生的,”FiftyThree 联合创始人兼首席执行官 Georg Petschnigg 解释道。库贝尔卡-蒙克的论文使团队能够将美学问题转化为数学框架。 [...]

从所有这些信息来看,似乎基于 Kubelka-Munk 模型的实现可能是前进的方向,并提供更接近现实的结果。

尽管它看起来像一个复杂的过程,但我还没有看到太多关于如何实现这样的事情的好信息。


相关问题

这些问题是在此问题之后发布的,都与同一件事有关。

他们都没有真正的答案。

  • RGB 混合颜色的计算
  • 在绘制颜色的颜色空间中查找其他两个颜色之间的算法
  • 像 Krita 一样实现 Kubelka-Munk 来像油漆一样混合颜色

其他相关链接和资源

  • 库贝尔卡-蒙克在 Twitter 上的搜索
  • Mixing paints (!!Con 2016) by Diana Liao
    • slides
    • video
  • 受绘画启发的可视化颜色混合和合成(N. Gossett、B. Chen)

The correct答案是否定的,因为没有correct working“现实世界中的颜色混合”如何真正起作用的模型。它太复杂和有条件了,根本不像我们在学校学到的简单的红-蓝-黄的东西(实际上它需要所有的化学知识和大量的物理和生物学来解决)。

然而,简单的答案是:是的,使用减法混合而不是Additive mixing.

我们在小学学到的颜色混合是基于颜料组合,这是减色混合的一种形式(非常简单)。也就是说,我们添加在一起的颜色越多,它就会变得越暗,因为每种颜料都会减去更多的光。

另一方面,几乎所有计算机配色方案都是additive因为它们基于组合光波(非常简单),因此它们变得更亮,因为每种颜色都会增加一点点光。

RGB+方案在某种程度上是我们在大多数美国小学中学到的减法方案(即RBY-)的加法补充。然而,它们并不完全匹配,并且它们之间的转换可能很困难(现在正在研究......)


好的,如果您只想从 RGB 的加法组合切换为减法组合,您可以使用以下反向贝叶斯类型公式来组合两种颜色:

NewColor.R = (Color1.R * Color2.R)/255
NewColor.G = (Color1.G * Color2.G)/255
NewColor.B = (Color1.B * Color2.B)/255

调整色极的差异(G 到 Y,然后回到 G)要困难得多......


有人指出,这对于示例问题会产生黑色,从技术上讲,这对于真正的减法系统是正确的,但是,如果您想要更多的稀释/减法系统,您可以尝试以下方法:

NewColor.R = 255 - SQRT(((255-Color1.R)^2 + (255-Color2.R)^2)/2)
NewColor.G = 255 - SQRT(((255-Color1.G)^2 + (255-Color2.G)^2)/2)
NewColor.B = 255 - SQRT(((255-Color1.B)^2 + (255-Color2.B)^2)/2)

这会产生深灰色而不是黑色。但要获得黄色或任何接近的颜色,您仍然必须解决颜色方案的极点对齐问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否有一种颜色混合算法可以像混合真实颜色一样工作? 的相关文章

  • 高维最近邻搜索的最佳数据结构

    我实际上正在处理高维数据 50 000 100 000 个特征 并且必须对其执行最近邻搜索 我知道随着维度的增长 KD 树的性能很差 而且我还了解到 一般来说 所有空间分区数据结构都倾向于对高维数据执行详尽的搜索 此外 还有两个重要事实需要
  • 固定大小集以包含给定集的最大数量

    我有大约 1000 组尺寸 1 4 1 3 3 5 6 4 5 6 7 5 25 42 67 100 是否有可能找到包含最大数量的给定集合的大小为 20 的集合 检查每一个100 80 20 集 效率低下 我不太确定这是 NP 完全的 考虑
  • 如何确定算法函数的复杂度?

    您如何知道算法函数对于特定操作是否需要线性 常数 对数时间 它取决于CPU周期吗 您可以通过三种方式 至少 做到这一点 在网上查找算法 看看它是如何描述其时间复杂度的 根据输入大小 自己检查算法 查看嵌套循环和递归条件等内容 以及每个循环运
  • 最慢的计算复杂度(Big-O)

    在这些算法中 我知道 Alg1 是最快的 因为它是 n 平方的 接下来是 Alg4 因为它是 n 的立方 然后 Alg2 可能是最慢的 因为它是 2 n 这应该具有非常差的性能 然而Alg3和Alg5在我的阅读速度方面还没有遇到过 这两种算
  • 预乘 Alpha 合成

    我正在尝试实现预乘阿尔法混合 在本页 什么是颜色混合 https learn microsoft com en us previous versions windows xna bb976070 v xnagamestudio 41 它们确
  • 寻找将集合映射到整数的双射函数

    对于任意两个序列 a b 其中 a a1 a2 an 且 b b1 b2 bn 0a b具有相同的元素 而不关心它们的顺序 例如 如果 a 1 1 2 3 b 2 1 3 1 c 3 2 1 3 则 f a f b f a f b 我知道有
  • 由周期表元素形成的最大单词的算法

    我想为以下问题场景编写一个算法 根据元素周期表元素的名称 找到可以组成的最大单词 符号如Na Ne等应被视为单个元素 这是在一家知名公司的求职面试中被问到的 有人可以帮我解决这个问题吗 我认为更好的方法是检查字典中的每个单词 看看是否可以从
  • 类是否应该有静态和非静态成员

    我试图找出一个类何时适合同时具有静态和非静态函数 又名 obj new ClassA obj gt doOOPStuff something ClassA doStaticStuff Note This example is done in
  • 生成 n 色彩虹调色板

    我正在尝试用 可运行的代码在这里 http sketchpad cc XEXd5II9nC size 360 100 colorMode HSB 360 100 100 Hue in degrees in 0 360 saturation
  • 关于在字典中查找所有有效单词的算法问题

    给定一个字典 只是一个字符串列表 您收到来自外部来源的未知数量的信件 给定字母串 您将如何列出您可以通过这些字母的任意组合组成的所有有效单词 来自字典 因此 如果您收到 applead 你应该找到apple bad pad lead等 我知
  • C 埃及分数

    古埃及人仅使用以下形式的分数1 n因此任何其他分数都必须表示为这些单位分数的总和 而且 所有单位分数都是不同的 在C或Java中使任何分数成为埃及分数 总和越少越好 的好方法是什么 可以使用什么算法 分支定界 a 例如 3 4 1 2 1
  • 7 张牌扑克手牌评估器

    有谁知道评估 7 张牌扑克牌的快速算法吗 这比简单地暴力检查 7 张牌中每 21 个 5 张牌的组合更有效 Cheers Pete 我写了一篇JavaScript 核心评估方法仅使用位操作 因此速度非常快 考虑到这一点 查看 21 种组合还
  • 带路径压缩算法的加权 Quick-Union

    有一种 带路径压缩的加权快速联合 算法 代码 public class WeightedQU private int id private int iz public WeightedQU int N id new int N iz new
  • 快速约会算法

    我在一家咨询公司工作 大部分时间都在客户所在地 正因为如此 我很少见到同事 为了更好地了解彼此 我们将安排一个晚宴 会有很多小桌子 方便人们聊天 为了在聚会期间与尽可能多的不同的人交谈 每个人都必须每隔一段时间 比如每小时 换一张桌子 如何
  • 如何有效地找到距给定点最远的点(从一组点中)?

    我正在寻找一种算法或数据结构来解决以下问题 给你一组点 S 然后你会得到另一个点形式的 Q 查询 对于每个查询 找到集合中距离给定点最远的点 集合中最多有 10 5 个点和 10 5 个查询 所有点的坐标都在 0 到 10 5 范围内 我想
  • 数学组合的完美最小哈希

    首先定义两个整数N and K where N gt K 两者都在编译时已知 例如 N 8 and K 3 接下来 定义一组整数 0 N or 1 N 如果这使答案更简单 并调用它S 例如 0 1 2 3 4 5 6 7 的子集数量S wi
  • 需要一种将网络块范围折叠为超集范围列表的算法

    我的数学不及格 我需要一种有效的方法将网络范围缩小为超集 例如如果我输入 IP 范围列表 1 1 1 1至2 2 2 5 1 1 1 2至2 2 2 4 10 5 5 5至155 5 5 5 10 5 5 6至10 5 5 7 我想返回以下
  • 在两种颜色之间进行插值的最有效方法是什么? (预计有伪代码和按位运算)

    制作一个黑莓应用程序 想要一个渐变类 插入两种颜色的最有效方法 例如速度和电池寿命 是什么 请具体说明 Java of course int c1 0xFFAA0055 color 1 ARGB int c2 0xFF00CCFF colo
  • 举例解释bpe(字节对编码)?

    有人可以帮忙解释一下背后的基本概念吗BPE模型 除了这张纸 https arxiv org abs 1508 07909 目前还没有那么多解释 到目前为止我所知道的是 它通过将罕见和未知的单词编码为子词单元序列来实现开放词汇表上的 NMT
  • Java递归方法求阶乘返回负输出[重复]

    这个问题在这里已经有答案了 我知道这是溢出 但问题是 20 是相对较小的数字 这不应该发生 对吧 有没有更好的方法来查找大数 例如 1000 的阶乘 而不会得到这种奇怪的结果 public class RecursiveFunctionsE

随机推荐

  • std::条件编译时分支评估

    编译这个 template lt class T class Y class Args gt struct isSame static constexpr bool value std conditional lt sizeof Args
  • Apache Solr java 教程 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我是 Apache sol
  • POST/PUT Json RESTful 请求 Grails 的问题

    嗨 我有一个 grails 宁静的代码 我完善了一个 Json 获取和删除请求 我的问题是 我想使用 json 执行 Put 或 post 请求 但如果我使用程序来执行此操作 它会出现错误 我无法执行此操作 这是我的代码 一类 packag
  • jquery masonry 在初始页面加载时崩溃,单击“主页”菜单按钮后工作正常

    我的 jquery masonry 设置在初始页面加载时工作得很奇怪 似乎将图像放置在第一行中 第二行的位置与第一行重叠 第三行的位置相同 页面加载后 您可以单击主页按钮或徽标并重新加载页面 它可以正常工作 我在functions php中
  • ASP.NET XML 解析错误:找不到元素行号 1,列 1 错误

    嘿 我发现了一个奇怪的喜怒无常的页面 它随机地给我以下错误 XML Parsing Error no element found Location http kj2011 site 2011 nonprofit database overv
  • Linq To Sql 和全文搜索 - 可以做到吗?

    有没有人想出一种执行全文搜索的好方法 FREETEXT CONTAINS 对于使用标准 LinqToSql 查询语法的任意数量的任意关键字 我显然希望避免必须使用存储过程或必须生成动态 SQL 调用 显然 我可以将搜索字符串输入到使用 FR
  • 如何在某些元素上禁用 Cufon?

    我目前在您的网站上使用 Cufon 其类似于Cufon set fontFamily DIN Medium replace h1 现在 对于单个 H1 标签 我希望禁用 Cufon 这不会将 H1 标签更改为任何其他标签 它必须保持原样 如
  • Delphi非对称加密

    我正在寻找非对称加密算法的 Delphi 实现 而不依赖于外部 DLL 有可用的吗 我的目标是使用公钥 私钥对加密 解密字符串 或字节数组 安全黑盒Eldos 提供原生 全面的解决方案 包括证书管理和对外部加密设备 即 USB 令牌 的访问
  • 在 Android 中以管理员身份禁用应用程序之前需要密码

    我正在开发一个作为Admin 我可以使用以下代码来做到这一点 演示 DeviceAdminReceiver jav public class DemoDeviceAdminReceiver extends DeviceAdminReceiv
  • 使用 Bouncy Castle 签署 CSR

    我找不到任何描述如何使用 BC 签署 CSR 的代码 文档 作为输入 我有一个 CSR 作为字节数组 并且希望获得 PEM 和 或 DER 格式的证书 我已经走到这一步了 def signCSR csrData Array Byte ca
  • View 被推出 ConstraintLayout 中的约束

    我有一个约束布局与图像视图和 3 个链式文本视图 with a spread inside链条款式
  • R:将“特殊”字母转换为UTF-8?

    我在匹配表时遇到问题 其中一个数据帧包含特殊字符 而另一个数据帧不包含特殊字符 示例 做 安娜县 vs 多纳安娜县 这是一个可以重现输出的脚本 library tidyverse library acs tbl df acs fips pl
  • C++11 初始值设定项列表失败 - 但仅限于长度为 2 的列表

    我发现了一个不起眼的日志记录错误 因为长度为 2 的初始值设定项列表似乎是一个特殊情况 这怎么可能 该代码是使用 Apple LLVM 版本 5 1 clang 503 0 40 编译的 使用CXXFLAGS std c 11 stdlib
  • 如何在 SQLAlchemy 中使用 joinload/contains_eager 来实现启用查询的关系(lazy='dynamic' 选项)

    我有 SQLAlchemy 声明的以下模型类 class User Base id Column Integer primary key True name Column String nullable False unique True
  • 在 Matplotlib 中以科学记数法显示第一个小数位

    我目前正在使用 y 轴的科学记数法生成不同的数字 导致某些图上的刻度为 2 或 6 而另一些图上的刻度为 2 5 或 8 9 我希望 y 轴上始终保留一位小数的刻度 即使它添加了零 这是一个例子 import matplotlib pypl
  • 了解 Python 配置文件输出

    我正在尝试使用 Python 分析器来加速我的代码 我已经能够确定几乎所有时间都花在哪个特定函数上 但我无法弄清楚该函数中的时间花在哪里 下面是配置文件输出 其中显示 appendBallot 是罪魁祸首 耗时近 116 秒 下面 我有 a
  • 如何在Linux内核设备驱动程序中使用定时器?

    我想在 Linux 设备驱动程序中实现一个计数器 该计数器在每个固定时间间隔后递增 我想在计时器的帮助下做到这一点 示例代码片段将非常有用 看看下面的文章IBM Developerworks 计时器和列表 有一个如何使用 Linux 内核定
  • Swift 中忽略参数的用途是什么

    在 Swift 中 您可以编写以下内容 func foo Int gt return 1 其中下划线是被忽略的参数 我只是因为文档才知道这一点 但想不出任何关于为什么你会这样做的用例 我错过了什么吗 在以下情况下 忽略参数 或元组的成员 它
  • HtmlAgilityPack ——
    是否会因某种原因自行关闭?

    我只是写了这个测试来看看我是否疯了 using System using System Collections Generic using System Linq using System Text using HtmlAgilityPac
  • 是否有一种颜色混合算法可以像混合真实颜色一样工作?

    常见的 RGB 颜色混合与绘画颜色的混合有很大不同 它是光的混合而不是颜料的混合 例如 Blue 0 0 255 Yellow 255 255 0 Grey 128 128 128 应该是蓝色 黄色 绿色 是否有任何已知的颜色混合算法可以像