gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 14:35:50 28 4
gpt4 key购买 nike

我已经尝试解决这个问题有一段时间了,这让我发疯。大多数人都知道,如果你画 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);
}
}

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

很多人都指出了这一点。约瑟夫·阿尔伯斯 (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);
}
}

这是输出:

enter image description here

关于java - 计算感知的颜色亮度的相等步长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16499321/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com