我已经尝试解决这个问题有一段时间了,这让我发疯。大多数人都知道,如果你画 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);
}
}
正如您所看到的,一些深色瓷砖之间的对比度比一些白色瓷砖之间的对比度要大得多。
很多人都指出了这一点。约瑟夫·阿尔伯斯 (Josef Albers) 在他的《色彩的艺术》一书中描述(基于韦伯-费希纳定律),您应该以指数级的步骤增加亮度。后来证明,阿尔伯斯确实这么做了 some nasty miscalculations ,并且使用亮度恒定对数增加的想法被证明是正确的 only within very limited bounds 。关于这方面的论文有很多,但其中很多对我来说很难阅读,而且大多数都与视网膜的物理方面有关。
所以我的问题是:
给定任何颜色,如何计算从 HSV 亮度 0 到 100 的感知相等的亮度步长?
更好的是,如何计算从任何一种颜色到任何其他颜色的感知亮度的相等步长?
我正在生成通过代码打印的文件,我需要在处理中执行此操作。任何语言的任何示例都可以。
最佳答案
对于其他希望在处理中执行此操作的人,这就是答案。 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);
}
}
这是输出:
关于java - 计算感知的颜色亮度的相等步长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16499321/