是否有一种算法可以在给定色调值(0 度到 360 度之间)的情况下找出颜色的波长。MATLAB中是否有相同的内置函数?
6 回答
虽然 Mark Ransom 和 Franco Callari 完全正确,您无法恢复感知颜色的光谱,也无法将色调值明确映射到波长,但如果您只想要相应的单色波长,您绝对可以拼凑一些东西。
270 到 360 之间的色相循环部分是另一个问题。光谱中没有对应于粉红色或洋红色的东西,所以我们假设我们只使用 0 到 270 度之间的色调值。
估计可见光谱的可用部分为 400-650nm,具有波长L
(nm)和色调值H
(度),您可以即兴发挥:
L = 650 - 250 / 270 * H
650是最大波长,250是波长范围,270是色调范围。
我认为这应该是正确的方向,但当然可能还有改进的余地。在可见光谱图上比较输入色调和相应颜色,然后稍微调整值,您可能可以获得更好的结果。
简短的回答:不。给定的色调通常可以由三倍无穷大的波长产生。
“物理颜色”是纯光谱颜色(在可见范围内)的组合。原则上存在无限多不同的光谱颜色,因此所有物理颜色的集合可以被认为是一个无限维向量空间(希尔伯特空间)。这个空间通常用 H颜色表示。从技术上讲,物理颜色的空间可以被认为是单纯形上的拓扑锥,其顶点是光谱颜色,质心为白色单纯形的颜色,圆锥顶点处的黑色,以及与任何给定顶点相关联的单色颜色,该顶点沿从该顶点到顶点的线的某处取决于其亮度。
. . .
该系统意味着对于不在色度图边界上的任何色调或非光谱颜色,有无限多个不同的物理光谱都被感知为该色调或颜色。因此,一般来说,没有我们认为(比如说)特定版本的棕褐色的光谱颜色组合之类的东西。相反,有无数种可能性可以产生这种确切的颜色。纯光谱颜色的边界颜色只能响应纯粹在相关波长的光来感知,而“紫色线”上的边界颜色只能由纯紫色和纯紫色的特定比例产生。可见光谱颜色末端的纯红色。
CIE 色度图呈马蹄形,其曲线边缘对应所有光谱颜色(光谱轨迹),其余直边对应最饱和的紫色,红色和紫色的混合色。
(来源)
可以找到颜色/色调的主波长。但正如所说,大多数颜色都不是单色的,相同的颜色可以用不同的“混合”波长构成。即同色异谱。此外,对于额外光谱的品红色和紫色,只能指定互补波长。即与白色相加混合的色调/主要波长。还必须指定白色,因为由于适应,它不是绝对的白色。同样在心理上,我们对色调的感知并不遵循主要的色调线。Se Munsell 和 NCS 系统。
在这里,您可以根据 RGB 值或不同的 CIE 系统计算主波长:http ://www.brucelindbloom.com/index.html?Calc.html 我没有公式。
然后,您可以将 RGB 转换为 HSL 或类似的转换。并且往返于 Munsell 或 NCS 感知色调(NCS 值是专有的,因此您必须付费并使用他们的软件)。
我无法提供简单的解决方案,但您需要考虑以下几点:
- 光谱的可见部分大约在 380nm(UV 边界)和 780nm(IR 边界)之间。但是你看到的(色调)取决于触发的视锥细胞。在 660nm 以上,M-cone 根本没有被触发,所以 660nm 和 780nm 之间的一切都是色调 0°。
- 在 580nm 你有黄色,色调为 60°,最纯的绿色约为 535nm,即 120°,最纯的蓝色(240°)约为 457nm。
- 如果你应用一个线性函数,黄色应该是 597nm - 它不是,所以你需要一个更复杂的方法。
- 在蓝色以上,红色锥体仍然会被触发,直到我们看到紫色,但我们不会在更高的频率上再次达到红色,所以你不能超过大约 300°。
- 300° 和 360° 之间的色调范围在可见光谱中没有等效值,它只能通过将高频光(蓝色或紫色)与红光混合来模拟,这会导致紫线上的品红色和红色之间出现某种颜色。
我发现这个网站可以将给定的波长转换为色调。通过一些工作,您实际上可以扭转这个过程。这并不理想,但在解决这个问题时,我更信任应用数学顾问而不是我自己。就是这样。
https://www.johndcook.com/wavelength_to_RGB.html
function convert(input) {
var w = parseFloat(input);
if (w >= 380 && w < 440) {
r = -(w - 440) / (440 - 380);
g = 0.0;
b = 1.0;
} else if (w >= 440 && w < 490) {
r = 0.0;
g = (w - 440) / (490 - 440);
b = 1.0;
} else if (w >= 490 && w < 510) {
r = 0.0;
g = 1.0;
b = -(w - 510) / (510 - 490);
} else if (w >= 510 && w < 580) {
r = (w - 510) / (580 - 510);
g = 1.0;
b = 0.0;
} else if (w >= 580 && w < 645) {
r = 1.0;
g = -(w - 645) / (645 - 580);
b = 0.0;
} else if (w >= 645 && w < 781) {
r = 1.0;
g = 0.0;
b = 0.0;
} else {
r = 0.0;
g = 0.0;
b = 0.0;
}
// Let the intensity fall off near the vision limits
if (w >= 380 && w < 420)
factor = 0.3 + 0.7 * (w - 380) / (420 - 380);
else if (w >= 420 && w < 701)
factor = 1.0;
else if (w >= 701 && w < 781)
factor = 0.3 + 0.7 * (780 - w) / (780 - 700);
else
factor = 0.0;
var gamma = 0.80;
var R = (r > 0 ? 255 * Math.pow(r * factor, gamma) : 0);
var G = (g > 0 ? 255 * Math.pow(g * factor, gamma) : 0);
var B = (b > 0 ? 255 * Math.pow(b * factor, gamma) : 0);
return [R, G, B]
}
没有转换,因为它们不重叠。
Hue 让您在 RGB 色彩空间中移动,通常是几乎所有消费类数字设备都使用的sRGB 。这是我们的视觉系统在正常条件下(由CIE 1931定义)识别的颜色的子集,并且根本不与在单色波长的光下感知的鲜艳颜色线重叠。
尽管从 0-120(红橙色到黄绿色)和接近 240(靛蓝)的色调相当接近,但如果您不关心所有褪色的绿色和蓝色,sRGB 是非常实用的,您可以伪造紫色和红色通过使它们分别在 270 或 330 左右变暗色调来结束全光谱,而唯一无法真正近似的地方是 180 左右,计算机青色根本不接近单色的充满活力的蓝绿色。