Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 色调到波长映射_Matlab_Image Processing_Colors - Fatal编程技术网

Matlab 色调到波长映射

Matlab 色调到波长映射,matlab,image-processing,colors,Matlab,Image Processing,Colors,在给定色调值(0度到360度之间)的情况下,是否有一种算法可以找出颜色的波长。Matlab中是否有相同的内置函数?简短回答:没有。给定的色调通常可以由三个无限波长产生 “物理颜色”是纯颜色(在可见范围内)的组合。原则上,存在无限多个不同的光谱颜色,因此所有物理颜色的集合可以被认为是一个无限维(a)。该空间通常用Hcolor表示。更严格地说,物理颜色的空间可以被认为是在其顶点为光谱颜色的区域上,在单纯形的顶部为白色,在圆锥体的顶点为黑色,在从该顶点到顶点的直线上的某处,单色颜色与任何给定顶点相关,

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

简短回答:没有。给定的色调通常可以由三个无限波长产生

“物理颜色”是纯颜色(在可见范围内)的组合。原则上,存在无限多个不同的光谱颜色,因此所有物理颜色的集合可以被认为是一个无限维(a)。该空间通常用Hcolor表示。更严格地说,物理颜色的空间可以被认为是在其顶点为光谱颜色的区域上,在单纯形的顶部为白色,在圆锥体的顶点为黑色,在从该顶点到顶点的直线上的某处,单色颜色与任何给定顶点相关,这取决于其亮度

. . . 该系统意味着,对于不在色度图边界上的任何色调或非光谱颜色,存在无限多个不同的物理光谱,它们都被视为该色调或颜色。所以,一般来说,没有光谱颜色的组合是我们认为(比如)棕褐色的一个特定版本;取而代之的是,有无限多的可能性产生这种精确的颜色。纯光谱颜色的边界颜色只能响应于纯相关波长的光,而“紫色线”上的边界颜色只能由可见光谱颜色末端的纯紫色和纯红色的特定比率生成

CIE色度图呈马蹄形,其弯曲边缘对应于所有光谱颜色(光谱),剩余的直边对应于最饱和的和的混合物

()


马克·兰森和弗朗哥·卡拉里完全正确,你无法恢复感知颜色的光谱,也无法明确地将色调值映射到波长,但如果你只需要相应的单色波长,你肯定可以将一些东西拼凑在一起

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

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

 L = 650 - 250 / 270 * H
650是最大波长,250是波长范围,270是色调范围

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


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

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

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

      色调在RGB颜色空间中移动,这通常是几乎所有消费数字设备都使用的颜色空间。这是我们的视觉系统在正常条件下识别的颜色的一个子集(定义为),与在单色光波长下感知到的颜色的活跃线完全不重叠


      虽然从0-120(红橙色到黄绿色)和接近240(靛蓝)的色调相当接近,但如果你不在乎所有褪色的绿色和蓝色,sRGB是相当实用的,你可以通过分别在270或330左右使它们变暗来伪造全光谱的紫色和红色端,唯一你无法准确估计的地方是180度左右,电脑青色与单色鲜艳的蓝绿色根本不接近。

      有可能找到一种颜色/色调的主要波长。但正如所说的,大多数颜色不是单色的,相同的颜色可以用不同波长的“混合”构成。即同色异谱。 此外,对于额外光谱的品红和紫罗兰色,只能指定互补波长。即与白色混合的色调/主波长。此外,还必须指定白色,因为由于自适应而不是绝对白色。 从心理上讲,我们对色彩的感知并不遵循主导色调线。使用孟塞尔和NCS系统

      在这里,您可以根据RGB值或不同的CIE系统计算主波长: 不过我没有这个公式


      然后,您可以将RGB转换为HSL或类似的格式。和蒙塞尔或NCS感知色调(NCS值是专有的,所以你必须付费并使用他们的软件)。

      我发现了这个网站,它可以将给定的波长转换为色调。只要做一点工作,你就可以逆转这个过程。这并不理想,但在解决这个问题上,我更信任那个在应用数学领域担任顾问的人。就这样

      函数转换(输入){
      
      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]
      }