我有一个项目,需要对像素的颜色进行分类。无论是红色、紫罗兰色、橙色还是任何彩色轮中的颜色。我知道像素有超过1600万种颜色组合。但我读到一篇网页文章说,我可以使用颜色的波长来完成我的项目。请给我计算使用RGB值计算波长的公式。谢谢!
我有一个项目,需要对像素的颜色进行分类。无论是红色、紫罗兰色、橙色还是任何彩色轮中的颜色。我知道像素有超过1600万种颜色组合。但我读到一篇网页文章说,我可以使用颜色的波长来完成我的项目。请给我计算使用RGB值计算波长的公式。谢谢!
纯色拥有一个波长(任何单色LED都会有一个特定的波长)。 红色、绿色和蓝色都有一定范围的波长。然而,当你制作RGB颜色时,你将这些波长加在一起,这不会得到新的波长。眼睛无法区分由一个波长组成的黄色和由红色和绿色混合而成的黄色(这就是眼睛的工作原理)。 我建议您了解一下颜色理论。
对于显示器来说,RGB代表红、绿、蓝三种独立的光级别,所以任何一种感知颜色中(大多数情况下)都存在三个不同的波长。
但是如果你能将RGB颜色值转换为其相应的HSL值,则H部分(色相)在波长方面是占主导地位的如果你准备忽略饱和度(将其视为白度)。
基于此,你可以近似计算颜色的主导波长,基于其H值。
红光的波长大约为630-740nm,紫罗兰色的波长大约为380-450nm。
计算波长有点棘手,正如Goblin所提到的,有时不可能(另一个例子是通过混合相等量的红色和蓝色光得到的颜色。那种紫色没有单一的波长)。
但如果你只是想通过名称识别颜色,那么HSV模型是一个很好的选择。HSV指的是色调(颜色在色轮周围的位置),饱和度(颜色的多少与黑色/灰色/白色相比)和亮度(像素的明暗程度)。在这种情况下,色调可能正是您想要的。
如果您正在使用.NET语言,那么您很幸运。请参阅Color.GetHue方法,它可以为您完成所有工作。
否则,请参见维基百科上的HSV了解更多详情。
实质上,如果您的R、G和B是浮点数,范围从0.0到1.0(而不是例如从0到255的整数),那么:
M = max(R, G, B)
m = min(R, G, B)
C = M-m
if M = m then H' is undefined (The pixel is some shade of grey)
if M = R then H' = (G-B)/C mod 6
if M = G then H' = (B-R)/C + 2
if M = B then H' = (R-G)/C + 4
将RGB转换为HSV后,需要将H'乘以60度,但对于您的目的来说,H'可能已经足够了。它将是一个浮点数,范围从0到6(几乎)。 0是红色(6也是红色)。 1是黄色,值在0和1之间的颜色在红色和黄色之间着色。因此,0.5将是橙色。重要的里程碑包括:
0 - Red
1 - Yellow
2 - Green
3 - Cyan
4 - Blue
5 - Purple
6 - Red (again)
C = 0
时,它会显示 "undefined",这是有道理的,但实际上,灰色是所有颜色中最接近白色的,只是吸收了一定量的光。只有当达到100%吸收率(即黑色)时,才无法确定是否存在所有波长。 - Alexis Wilke只需将RGB转换为HSV,然后将HSV值转换为角度,这就是答案:
650 - 250 / 270 * D
其中 D 代表度数。
考虑到...
紫色波长为380-450纳米,
蓝色波长为450-495纳米,
绿色波长为495-570纳米,
黄色波长为570-590纳米,
橙色波长为590-620纳米,
红色波长为620-750纳米,
因此,您只需要检查它是否在这些范围内,然后就可以对其进行分类。
希望这可以帮助您!