0

我一直试图弄清楚这一点,这让我发疯。大多数人都知道,如果你以相同的 HSV 亮度步长绘制 10 个相邻的矩形,范围从白色到黑色,它们将不会被视为与眼睛相同。这是一个例子:

HSB 亮度等间距的矩形

以及处理中的代码:

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);
  }
}

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

很多人都指出了这一点。Josef Albers 在他的《色彩的艺术》一书中描述了(基于 Weber-Fechner 定律)你应该以指数级增加亮度。后来证明,Albers 做了一些严重的错误计算,并且使用恒定对数增加亮度的想法仅在非常有限的范围内证明是正确的。有很多关于这方面的论文,但其中很多对我来说很难阅读,而且大多数都与视网膜的物理方面有关。

所以我的问题是:

给定任何颜色,我如何计算从 HSV 亮度 0 到 100的感知亮度相等步长?

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

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

4

1 回答 1

1

对于希望在处理中执行此操作的其他人,这是答案。Toxiclibs TColor 类附带 LAB -> 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);
  }
}

这是输出:

在此处输入图像描述

于 2013-05-12T02:35:39.350 回答