10

是否有一种算法可以在给定色调值(0 度到 360 度之间)的情况下找出颜色的波长。MATLAB中是否有相同的内置函数?

4

6 回答 6

16

虽然 Mark Ransom 和 Franco Callari 完全正确,您无法恢复感知颜色的光谱,也无法将色调值明确映射到波长,但如果您只想要相应的单色波长,您绝对可以拼凑一些东西。

270 到 360 之间的色相循环部分是另一个问题。光谱中没有对应于粉红色或洋红色的东西,所以我们假设我们只使用 0 到 270 度之间的色调值。

估计可见光谱的可用部分为 400-650nm,具有波长L(nm)和色调值H(度),您可以即兴发挥:

 L = 650 - 250 / 270 * H

650是最大波长,250是波长范围,270是色调范围。

我认为这应该是正确的方向,但当然可能还有改进的余地。在可见光谱图上比较输入色调和相应颜色,然后稍微调整值,您可能可以获得更好的结果。

色调到波长函数的图

于 2012-08-08T04:19:30.833 回答
2

简短的回答:不。给定的色调通常可以由三倍无穷大的波长产生。

“物理颜色”是纯光谱颜色(在可见范围内)的组合。原则上存在无限多不同的光谱颜色,因此所有物理颜色的集合可以被认为是一个无限维向量空间希尔伯特空间)。这个空间通常用 H颜色表示。从技术上讲,物理颜色的空间可以被认为是单纯形上的拓扑锥,其顶点是光谱颜色,质心为白色单纯形的颜色,圆锥顶点处的黑色,以及与任何给定顶点相关联的单色颜色,该顶点沿从该顶点到顶点的线的某处取决于其亮度。

. . .

该系统意味着对于不在色度图边界上的任何色调或非光谱颜色,有无限多个不同的物理光谱都被感知为该色调或颜色。因此,一般来说,没有我们认为(比如说)特定版本的棕褐色的光谱颜色组合之类的东西。相反,有无数种可能性可以产生这种确切的颜色。纯光谱颜色的边界颜色只能响应纯粹在相关波长的光来感知,而“紫色线”上的边界颜色只能由纯紫色和纯紫色的特定比例产生。可见光谱颜色末端的纯红色。

CIE 色度图呈马蹄形,其曲线边缘对应所有光谱颜色(光谱轨迹),其余直边对应最饱和的紫色红色紫色的混合色。

来源

于 2012-08-08T02:08:04.577 回答
2

可以找到颜色/色调的主波长。但正如所说,大多数颜色都不是单色的,相同的颜色可以用不同的“混合”波长构成。即同色异谱。此外,对于额外光谱的品红色和紫色,只能指定互补波长。即与白色相加混合的色调/主要波长。还必须指定白色,因为由于适应,它不是绝对的白色。同样在心理上,我们对色调的感知并不遵循主要的色调线。Se Munsell 和 NCS 系统。

在这里,您可以根据 RGB 值或不同的 CIE 系统计算主波长:http ://www.brucelindbloom.com/index.html?Calc.html 我没有公式。

然后,您可以将 RGB 转换为 HSL 或类似的转换。并且往返于 Munsell 或 NCS 感知色调(NCS 值是专有的,因此您必须付费并使用他们的软件)。

于 2018-09-12T14:10:59.407 回答
1

我无法提供简单的解决方案,但您需要考虑以下几点:

  • 光谱的可见部分大约在 380nm(UV 边界)和 780nm(IR 边界)之间。但是你看到的(色调)取决于触发的视锥细胞。在 660nm 以上,M-cone 根本没有被触发,所以 660nm 和 780nm 之间的一切都是色调 0°。
  • 在 580nm 你有黄色,色调为 60°,最纯的绿色约为 535nm,即 120°,最纯的蓝色(240°)约为 457nm。
  • 如果你应用一个线性函数,黄色应该是 597nm - 它不是,所以你需要一个更复杂的方法。
  • 在蓝色以上,红色锥体仍然会被触发,直到我们看到紫色,但我们不会在更高的频率上再次达到红色,所以你不能超过大约 300°。
  • 300° 和 360° 之间的色调范围在可见光谱中没有等效值,它只能通过将高频光(蓝色或紫色)与红光混合来模拟,这会导致紫线上的品红色和红色之间出现某种颜色。
于 2017-01-10T00:03:40.203 回答
0

我发现这个网站可以将给定的波长转换为色调。通过一些工作,您实际上可以扭转这个过程。这并不理想,但在解决这个问题时,我更信任应用数学顾问而不是我自己。就是这样。

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]
}
于 2021-02-13T21:32:05.710 回答
0

没有转换,因为它们不重叠。

Hue 让您在 RGB 色彩空间中移动,通常是几乎所有消费类数字设备都使用的sRGB 。这是我们的视觉系统在正常条件下(由CIE 1931定义)识别的颜色的子集,并且根本不与在单色波长的光下感知的鲜艳颜色线重叠。

尽管从 0-120(红橙色到黄绿色)和接近 240(靛蓝)的色调相当接近,但如果您不关心所有褪色的绿色和蓝色,sRGB 是非常实用的,您可以伪造紫色和红色通过使它们分别在 270 或 330 左右变暗色调来结束全光谱,而唯一无法真正近似的地方是 180 左右,计算机青色根本不接近单色的充满活力的蓝绿色。

于 2018-07-19T16:54:41.060 回答