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

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

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

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

相关文章:

java - 无法检索JAVA中静态变量的值

java - 如何使用渐变。 Java 和 Groovy 在一起?

java - Search Between可以隐藏过去的product_Name交易

java - ZipFile.getEntry 导致 java 应用程序挂起

xaml - 如何在 Xamarin 表单中向页面填充添加颜色?

processing - 关于应变计与 PC 连接的建议

python - 如何在 python 2.7.3 中更改文本颜色

android - 带 alpha 的颜色的 Android 命名约定是什么?

glsl - 使用着色器实现粘稠效果(处理 3)

java - 了解加工过程中圆是如何形成的