Hit*_*ama 6 rgb colors hsb color-theory
我正在为家庭自动化系统中的灯光管理构建一个界面.我设法控制各种供应商的标准开/关和可调光,几乎没有问题,但现在我遇到了与RGB灯有关的问题.
我目前使用的是RGBW LED灯条 - 具体来说,我正在使用低成本的RGBW灯:灯由四个LED组成,每个LED都可以单独控制.
为了更清楚 - 我正在研究一些c#代码,它们应该检索当前选择的颜色并在UI中显示它,并使用户能够指定灯光的新颜色.为了设置颜色并检索它,我必须使用命令提供程序,使我能够通过Web服务发送和接收命令.
提供商使用RGBW颜色 - 使用红色,绿色,蓝色和白色四个组件.为了表示我界面上的当前灯光颜色,我想将服务返回的RGBW颜色转换为更标准的RGB/HSB方案.
搜索网页,我找到的唯一的颜色转换参考(不包括rgb到rgbw转换的c ++示例,基于我的理解,必须有一些严重的错误)本文显示了从HSI到RGBW的转换,这是与我需要的相反:链接在这里
我正在寻找一些关于如何实现这种转换的见解(或者为什么不可能的简单解释).就我而言,从RGB到RGBW的转换是任意的 - 单个RGB值可以表示为多个RGBW值,但相反的转换应该是单义的.另请注意,虽然我使用的是c#,但也可以自由地引用其他语言的算法 - 语言不是问题,问题是我不知道数学做颜色转换.
如何将RGB转换为RGBW将在以下文章的2.1中描述
http://www.mirlab.org/conference_papers/International_Conference/ICASSP%202014/papers/p1214-lee.pdf
把你的LED想象成一个巨大的像素.奥利弗的回答使用了Wo = min(Ri,Gi,Bi),什么是计算上便宜而且正常工作.本文介绍了最小化功耗的其他替代方案,这对家庭自动化项目有利.我也参与了一个有OpenHAB,Arduino和RGBW LED的家庭自动化项目,一方面提出的替代方案也不错,另一方面,一个巨大的LUT将无法工作并转换arduino eighter上的所有值.我建议你尝试使用本文中引用的不那么节能的技术来校正RGB值:
假设Ri,Gi,Bi是颜色输入,整数从0到255,所以Q = 255,输出为Wo,Ro,Go和Bo,值为0到255:
M = max(Ri,Gi,Bi)
m = min(Ri,Gi,Bi)
Wo = if (m/M < 0.5) use ( (m*M) / (M-m) ) else M
Q = 255
K = (Wo + M) / m
Ro = floor( [ ( K * Ri ) - Wo ] / Q )
Go = floor( [ ( K * Gi ) - Wo ] / Q )
Bo = floor( [ ( K * Bi ) - Wo ] / Q )
Run Code Online (Sandbox Code Playgroud)
在实现之前在电子表格中练习,在Wo = m,m ^ 2和-m ^ 3 + m ^ 2 + m上进行实验,用正确的Qw校正Wo值,你会惊讶于没有校正的简单解决方案不是什么人们会期待,其他答案变化不大.检查纸张的颜色失真结果,我想如果你不校正RGB值,你最终会得到一些褪色的颜色.
小智 5
我一直在查看 Roberto 建议的答案,但在许多情况下,颜色似乎更暗且不饱和。以 RGB = (255,255,2) 为例,得到 RGBW = (128,128,1,2)。
进一步挖掘,Chul Lee 的论文似乎在 K 的方程中存在错误。该方程来自 Lili Wang 的论文(“手机使用的 RGBW 显示器中亮度和颜色之间的权衡”)实际上是:
K = (Wo + M)/M
Run Code Online (Sandbox Code Playgroud)
请注意,它是大写的 M,而不是小写的 m。鉴于此更改,您也不需要 Q,因为它天生可以适当缩放。在相同的 RGB = (255,255,2) 示例上使用新 K 会导致更合理的 RGBW = (255,255,0,2)。
把它们放在一起:
M = max(Ri,Gi,Bi)
m = min(Ri,Gi,Bi)
Wo = if (m/M < 0.5) use ( (m*M) / (M-m) ) else M
K = (Wo + M) / M
Ro = floor[ ( K * Ri ) - Wo ]
Go = floor[ ( K * Gi ) - Wo ]
Bo = floor[ ( K * Bi ) - Wo ]
Run Code Online (Sandbox Code Playgroud)