实现类似Krita的Kubelka-Munk方法以混合颜色,就像混合油漆一样。

7

你是在问有没有人在Cocoa中实现过这个功能吗?这个函数本身可以通过谷歌轻松找到。链接 - Rob Keniger
很好的发现。不,我是在询问如何使用这个函数或类似的函数来自然地混合颜色 - 就像视频中展示的那样。我认为棘手的部分将是将RGB值转换为函数的输入。 - glenstorey
3个回答

8

欢迎在krita中重复使用我们的代码。它位于calligra/krita/plugins/extensions/painterlyframework中。它需要pigment库作为后备,但我想你可以很容易地从中抽象出来。

但请注意,该代码是根据GPLv2+许可证发布的。如果您重用代码或光源文件,则您的代码也需要遵守GPL。

(有关更多信息,请与我联系-- boud@valdyas.org或irc.freenode.net上的boud #krita,我是Krita的维护者)。


非常感谢您的回答!我将离开一周,但之后会给您发送电子邮件。 - glenstorey
看起来这个已经不在当前的Krita代码中了,它是否演变成了Krita中的其他功能?数字颜色混合器似乎最接近。 - Gnaural
1
源代码在 GitHub 上,位于历史记录中:https://github.com/KDE/krita/tree/7036146c5a75e53196a20a3e4232313d796de9d9/krita/plugins/extensions/painterlyframework - CyberFox

5

仅凭RGB值提供的信息不足以进行真正的Kubelka-Munk计算,因为您需要横跨可见光谱的吸收和散射曲线。相反,您可以从RGB值生成代表性反射率曲线,然后使用反射率信息执行减法混合,例如,通过计算两个反射率曲线的加权几何平均值。


2
这段 Matlab 代码将把 sRGB 转换为基于波长的光谱反射率:`function reflectance=LSS(B12,sRGB)% 计算目标“线性 RGB”值 sRGB=sRGB(:)/255; % 转换为0-1列向量 for i=1:3 if sRGB(i)<0.04045 rgb(i)=sRGB(i)/12.92; else rgb(i)=((sRGB(i)+0.055)/1.055)^2.4; end endreflectance=B12*rgb;`矩阵 B12 可在此处找到。一旦将两个 sRGB 颜色转换为反射率曲线,就可以混合这些曲线(平均它们或更好地获取它们的“加权几何平均值”)。 - Scott Burns
抱歉代码有点混乱。我不知道如何在注释中换行。 - Scott Burns
1
此外,如果上述代码中的任何反射值为负数,则需要使用稍微复杂一些的版本 - Scott Burns
更正:不要像我建议的那样对反射率曲线求平均值。这将给出与仅对RGB值求平均值相同的结果!相反,使用加权几何平均数来模拟颜料混合,或者如果想要模拟重叠的彩色滤光片,则将曲线相乘,这是一种更“强大”的减法混合方法。 - Scott Burns
为什么不直接编辑您的答案而不是将代码放在评论中? 什么是LSS? - slashdottir
为什么不直接编辑你的答案,而是把代码放在评论中呢?LSS是什么意思? - slashdottir

4

以下是我创建的实现,使用简化的Kubelka-Munk模型。它假定当混合时所有颜色具有相同的浓度并且所有颜色都是不透明的。如果它有用,请随意以任何方式使用它。

https://github.com/benjholla/ColorMixer


感谢您分享您的颜色混合器实现。但是,我认为它不能正常工作。例如,将红色(255,0,0)与黄色(255,255,0)混合后,我应该得到一种橙色:(例如255,128,0),但我得到了255,2,1,这是相同的红色。有什么想法吗?我做错了什么吗? - Tamás Pap
不,你说得对,看起来我的实现可能仍然存在一些混合问题。我尝试将我的RGB颜色空间转换为RYB以进行处理,但这并没有解决问题。我对它所输出的一些颜色混合感到有些困惑。虽然很多看起来是正确的... - Ben Holland

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接