如何使用RGB获取像素的波长?

21

我有一个项目,需要对像素的颜色进行分类。无论是红色、紫罗兰色、橙色还是任何彩色轮中的颜色。我知道像素有超过1600万种颜色组合。但我读到一篇网页文章说,我可以使用颜色的波长来完成我的项目。请给我计算使用RGB值计算波长的公式。谢谢!


请提供您提到的网页链接。 - pavium
1
如果一个颜色不在色轮中,比如灰色呢?这样的颜色没有波长。 - Goblin Alchemist
1
监视器校准怎么样? - AdrianS
1
这个问题跟哪种编程语言有关吗?然而,这并不是一件容易的事情。先从这个开始看起:什么波长与颜色相对应? - Wh1T3h4Ck5
你可以将sRGB转换为CIE XYZ,这样会更容易一些,但我也找不到直接的转换方式。 - Mark Ransom
我发现了一个名为ColorPy的Python库,声称可以将波长映射到RGB,也许可以反过来使用? - Mark Ransom
5个回答

10

纯色拥有一个波长(任何单色LED都会有一个特定的波长)。 红色、绿色和蓝色都有一定范围的波长。然而,当你制作RGB颜色时,你将这些波长加在一起,这不会得到新的波长。眼睛无法区分由一个波长组成的黄色和由红色和绿色混合而成的黄色(这就是眼睛的工作原理)。 我建议您了解一下颜色理论。

http://en.wikipedia.org/wiki/RGB_color_model


7

对于显示器来说,RGB代表红、绿、蓝三种独立的光级别,所以任何一种感知颜色中(大多数情况下)都存在三个不同的波长。

但是如果你能将RGB颜色值转换为其相应的HSL值,则H部分(色相)在波长方面是占主导地位的如果你准备忽略饱和度(将其视为白度)。

基于此,你可以近似计算颜色的主导波长,基于其H值。

红光的波长大约为630-740nm,紫罗兰色的波长大约为380-450nm。


2
UV波长也可以吗?我的意思是,如果像素的RGB由UV波组成,是否可能检测其源波长?请帮帮我!没有人能帮我:( - Soheil
3
RGB值是用于可见光的,因此紫外线的RGB值在定义上是不可能表示的。 - geon
2
@geon 但是在大多数安卓设备相机中,没有紫外线滤镜,并且许多紫外线波长在设备屏幕上以某种RGB显示。例如:http://sci-toys.com/scitoys/scitoys/light/invisible/invisible.html - Soheil
4
当然,摄像机可以捕捉红外线和紫外线光。在视频摄像机上,红外线通常用作“夜视”模式。但是,红外线/紫外线光会转换为与其他光一样的RGB值,并且通常在图像中看起来是白色或灰色,因此您无法分析图像并查看它是否是UV / IR。一些类型的摄像机,如望远镜,通常可以区分紫外线和红外线,但它们具有特殊的传感器、滤光片和软件,可以创建不仅是RGB值,而是RGB + IR + UV + 任何其他数据。需要存储更多数据,并且显然不能使用只期望RGB的正常软件查看图像。 - geon
1
@geon 谢谢你提供的有用信息,帮助我更好地理解了这个问题 :) ;) - Soheil

5

计算波长有点棘手,正如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)

希望这能帮到你。

@CatShoes 如果您使用0-255,则有256个阴影,如果使用浮点数-则有尽可能多的有理数或浮点数可以容纳的数量 :) - Lex Podgorny
请注意,当 C = 0 时,它会显示 "undefined",这是有道理的,但实际上,灰色是所有颜色中最接近白色的,只是吸收了一定量的光。只有当达到100%吸收率(即黑色)时,才无法确定是否存在所有波长。 - Alexis Wilke

1

http://en.wikipedia.org/wiki/Visible_spectrum

可以做到。请参见上文。灰色背景显然使事情更容易。你可能会自己得到类似的结果,并且甚至可以改进它。但是要准确地做到这一点将需要花费大量资金。你需要一个色度学专家,一个校准的显示器和观看环境(因为你的像素的主波长只意味着它在校准的显示器和校准的观看环境中近似的单色波长)。所有这些将需要几千美元。在上面链接中展示的工作,在维基百科上显示出来,似乎不是很准确,但这可能是你想要的。

1
哦,伙计,他不是在问如何确定他显示器上像素的真实物理波长,只是想从RGB值中确定它。 - Alexis Wilke

1

只需将RGB转换为HSV,然后将HSV值转换为角度,这就是答案:

650 - 250 / 270 * D

其中 D 代表度数。
考虑到...

紫色波长为380-450纳米,
蓝色波长为450-495纳米,
绿色波长为495-570纳米,
黄色波长为570-590纳米,
橙色波长为590-620纳米,
红色波长为620-750纳米,
因此,您只需要检查它是否在这些范围内,然后就可以对其进行分类。
希望这可以帮助您!


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