我一直试图弄清楚这一点,这让我很生气。正如大多数人所知,如果你画出10个相邻的矩形,从白色到黑色的HSV亮度相等,它们将不会被视为与眼睛相等。这是一个例子:
处理中的代码:
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中执行此操作。任何语言的任何例子都可以。
答案 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);
}
}
这是输出: