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 は著書 The Art of Color の中で、(Weber-Fechner の法則に基づいて) 明度を指数関数的に上げるべきだと説明しています。アルバースがいくつかのひどい誤算をしたことが後で証明され、一定の対数増加の明るさを使用するという考えは、非常に限られた範囲内でのみ真実であることが証明されました。これに関する多くの論文がありましたが、それらの多くは私には非常に読みにくく、そのほとんどは網膜の物理的側面に関連しています.

だから私の質問は:

任意の色が与えられた場合、HSV 輝度 0 から 100 までの知覚される輝度の等しいステップを計算するにはどうすればよいですか?

さらに良いことに、ある色から他の色への明るさの等間隔どのように計算すればよいでしょうか?

コードを使用して印刷用のファイルを生成していますが、これを Processing で行う必要があります。ただし、どの言語の例でも構いません。

4

1 に答える 1

1

Processingでこれをやろうとしている他の人たちのために、ここに答えがあります。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 に答える