2013-05-11 2 views
0

Я пытался понять это на некоторое время, и это сводит меня с ума. Как известно большинству людей, если вы рисуете 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); 
    } 
} 

Как вы можете видеть, контраст между некоторыми из темной плитки воспринимается гораздо больше, чем с некоторыми из белые плитки.

Многие люди указали это. В своей книге «Искусство цвета» Йозеф Альберс описывает (в соответствии с законом Вебера-Фехнера), что вместо этого вы должны увеличить яркость по показательным шагам. Позднее было доказано, что Альберс сделал some nasty miscalculations, и идея использования постоянного логарифмического увеличения яркости оказалась верной only within very limited bounds. Об этом было много, но многие из них очень трудно читать, и большинство из них связано с физическими аспектами сетчатки.

Так что мой вопрос:

Учитывая любой цвет, как я вычислить воспринимались равные ступени яркости от HSV яркости от 0 до 100?

Еще лучше, как рассчитать воспринимаемый равный уровень яркости от любого цвета до любого другого цвета?

Я создаю файлы для печати по коду, и мне нужно сделать это в разделе Обработка. Любой пример на любом языке будет делать.

+1

Восприятие цвета не может быть понята на цветовом пространстве HSB с момента его аппаратно зависимого цветового пространства. Вам необходимо ознакомиться с цветовыми пространствами CIE XYZ и CIE L * a * b *. CIE L * a * b * помогает вам в восприятии. Вам нужно будет перейти на преобразование из CIE L * a * b * в HSB и соответственно вычислить свою яркость. И для печати вам нужно посмотреть на вычисления HSB на CYMK. –

+0

Да, я подумал, что это так. У меня есть библиотека цветов, которая позволяет мне использовать CIE LAB. Итак, если я сделаю то же самое в LAB, изменив L с постоянным значением, я получу правильный результат? – Ronze

+0

Насколько я понимаю, вы бы превратили L * a * b * в XYZ, который является линейным цветовым пространством. Затем вы измените значение Y и преобразуете его в L *, используя формулу: L * = 116 * f (Y/Y0) - 16, где f (Y/Y0) может быть (Y/Y0)^1/3 или 1/3 * (29/6)^2 * (Y/Y0) +4/29. Выбранная вами формула будет зависеть от того, будет ли Y/Y0 больше или меньше (6/29)^3, если оно больше, вы выбираете прежнюю формулу, иначе последнюю. Y0 обычно принимается при 100 или около того. Вы можете найти значения для Y0 в Интернете в зависимости от ваших потребностей. Я лично всегда использовал 100 для этого. Примечание: Y0 = Y ничего. –

ответ

1

Для других людей, которые хотят сделать это в обработке, вот вам ответ. Класс TColor Toxiclibs поставляется с преобразованием 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

+0

+1. Наверное, мой путь был довольно длинным. Я предполагал, что вам нужно работать с цветами HSB в конце (которые вы все еще можете использовать с преобразованием RSB -> HSB). В любом случае, рад, что вы нашли решение. –

+1

Я действительно думаю, что сама библиотека делает именно то, что вы описали: Преобразование в пространство XYZ, а затем в RGB в некотором роде. Класс TColor имеет функцию toHSV(), поэтому в HSB colorMode он будет почти таким же. – Ronze

+0

У меня создается впечатление, что метод [fromCIEXYZ] (http://docs.oracle.com/javase/7/docs/api/java/awt/color/ColorSpace.html#fromCIEXYZ%28float []% 29) метода Класс ColorSpace будет делать то же самое без необходимости зависимости сторонних разработчиков. – VGR