计算颜色亮度中感知的相等步长

时间:2013-05-11 16:25:02

标签: java colors processing brightness hsv

我一直试图弄清楚这一点,这让我很生气。正如大多数人所知,如果你画出10个相邻的矩形,从白色到黑色的HSV亮度相等,它们将不会被视为与眼睛相等。这是一个例子:

rectangles with equal spacing in HSB brightness

处理中的代码:

void setup()
{
  size(600, 150);
  colorMode(HSB, 360, 100, 100);
  background(0, 0, 100);

  translate(50, 50);

  noStroke();
  for(int i = 0; i < 10; i++)
  {
    fill(0, 0, i * 10);
    rect(i * 50, 0, 50, 50);
  }
}

正如你所看到的,一些较暗的瓷砖之间的对比度比一些白色瓷砖要大得多。

很多人都指出了这一点。约瑟夫·阿尔伯斯在其着作“颜色的艺术”中描述(基于韦伯 - 费希纳定律),你应该以指数步长增加亮度。后来证明阿尔伯斯确实some nasty miscalculations,并且使用恒定对数增加亮度的想法证明是真的only within very limited bounds。有很多关于此的论文,但其中很多都是我难以阅读的,而且大多数都与视网膜的物理方面有关。

所以我的问题是:

鉴于任何颜色,我如何计算从HSV亮度0到100的亮度感知相等的步骤?

更好的是,我如何计算从任何一种颜色到任何其他颜色的亮度感知相等的步骤?

我正在通过代码生成要打印的文件,我需要在Processing中执行此操作。任何语言的任何例子都可以。

1 个答案:

答案 0 :(得分:1)

对于希望在Processing中执行此操作的其他人,这是答案。 Toxiclibs TColor类附带LAB - &gt; RGB转换,所以并不难。正如您在屏幕截图中看到的那样,区别很明显。

import toxi.color.*;
import toxi.geom.*;

void setup()
{
  size(600, 250);
  colorMode(RGB, 1, 1, 1);
  background(1);
  noStroke();
  translate(50, 50);

  // RGB: 10 rects where perceived contrast is NOT equal in all squares
  for(float i = 0; i < 10; i++)
  {
    fill(i / 10.0, i / 10.0, i / 10.0);
    rect(i * 50, 0, 50, 50);
  }

  // LAB: 10 rects where perceived contrast IS equal in all squares
  translate(0, 50);

  for(int i = 0; i < 10; i++)
  {
    float[] rgb = TColor.labToRGB(i * 10, 0, 0);
    TColor col = TColor.newRandom().setRGB(rgb);
    fill(col.toARGB());
    rect(i * 50, 0, 50, 50);
  }
}

这是输出:

enter image description here