在HSV空间中添加/混合颜色

8
我已经尝试了几天来进行可视化。我正在生成衍射图像,并希望根据光的波长对其进行着色。
最简单的方法是使用HSV空间,其中H随波长变化,而S和V设置为1.0。
然而,我找不到在HSV空间中混合不同颜色的公式/算法/方法。
是否有HSV混合的公式或其他易懂的方法?

你可能会发现这个先前的问题有用:https://dev59.com/8m025IYBdhLWcg3wPzXL - Mark Ransom
2个回答

6

说实话,我会将RGB转换为HSV,然后求出三个分量的平均值再转回RGB。

这并不是最高效的方法,但你可能已经有了或需要RGB<->HSV代码,而RGB计算很可能更简单。


更像是这样的:1. 对于每个波长:计算每个像素的强度。归一化,添加到double数组(图片)。2. 在写入之前:将图片数组归一化,缩放为255.0,转换为int。3. 最后存储到文件中(原始PPM或稍微处理一下的PNG)。唯一剩下的事情就是以某种方式检查图片是否物理上正确。 - Nox
1
我虽然觉得很有趣,但并不完全理解。如果你正在对RGB颜色进行归一化处理,那么你将把它们投影到某个曲线区域的颜色空间中。说实话,为了保存,现在我只会写原始字节,并使用命令行上的ImageMagick将其转换为PNG格式。 - andrewmu

5

《计算机图形学:原理与实践》(Foley等人)中的第13.3.7节“在颜色空间中插值”中说道:

“当两幅图像混合时[...]颜色可能相差很远,这时候加法模型,例如RGB,是适用的。另一方面,如果目标是在两个固定色调(或饱和度)之间进行插值,并保持所有插值颜色的固定色调(或饱和度),那么HSV或HLS更为合适。但请注意,HSV或HSL中的固定饱和度插值被观察者视为具有固定饱和度[...]”

因此,他们同意@andrewmu的建议,这似乎是一般情况下最好的建议。


如果你想在HSV空间中混合超过两种颜色(亮度和饱和度设置为1),该怎么办?你能否只是在色轮上将所有颜色向量相加?如果你用这种方式添加所有彩虹颜色(绕着轮子一圈),那么你应该得到白色,对吗? - pkout

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