Преобразование Между Цветовым Кругом Оттенка И Цветовым Кругом Иттена

  • Автор темы Asset
  • Обновлено
  • 22, Oct 2024
  • #1

К сожалению, цветовой круг оттенков не соответствует зрительному восприятию человека: равные различия угла оттенка воспринимаются как разные цветовые различия. Например. желтый занимает лишь небольшой диапазон углов на цветовом круге, см. https://de.wikipedia.org/wiki/Farbkreis, второй рисунок, для примера.

Есть исправления этой проблемы, такие как цветовой круг Иттена.

Мой вопрос: существуют ли уравнения, которые переводят угол цветового круга оттенка в угол цветового круга Иттена и наоборот? Конечно, интерполяция значений под разными углами также может работать, но уравнения могут быть лучше. Здесь приведены различные углы: https://uxplanet.org/algorithm-for-automatic-harmonious-color-selection-for-the-image-fc26dde69ca1#.lnuwum51m, на полпути вниз.

#теория цвета #преобразование цвета #цветовые пространства

Asset


Рег
19 Oct, 2006

Тем
70

Постов
192

Баллов
602
  • 26, Oct 2024
  • #2

Цветовой круг предмета также постоянно неравномерен, и цвета различаются в зависимости от печати и даже на разных страницах одной и той же копии. Если вы хотите, чтобы пространство всегда было более ровным, используйте пространство Манселла или лабораторию. Photoshop преобразует угол оттенка RGB в координаты Lab, и вы можете легко вычислить угол оттенка по координатам a и b Lab.

 

John G.


Рег
20 Apr, 2006

Тем
67

Постов
182

Баллов
537
  • 26, Oct 2024
  • #3

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

Однако похоже, что вы хотите иметь возможность конвертировать значение «Оттенок» HSV из цветового круга HSV в цветовой круг Иттена следующим образом:

Вы можете видеть, что на первом колесе значения красного, синего и зеленого цвета составляют 0, 120 и 240 градусов соответственно. На втором - красный, желтый и синий в одних и тех же местах. Итак, что вам нужно сделать, это преобразовать из RGB в RYB. Вот моя реализация на C#, в основном взято отсюда (все скопировано сюда на случай, если источник однажды выйдет из строя)::

 
 private Vector3 RYBToHSV(Vector3 color)
{

float r = color[0], y = color[1], b = color[2];

float mx = Mathf.Max(r, y, b);

float mn = Mathf.Min(r, y, b);

float df = mx - mn;

float h, s, v;

if (mx == mn)

{

h = 0.0f;

}

else if (mx == r)

{

h = (60.0f * ((y - b) / df) + 360.0f) % 360.0f;

}

else if (mx == y)

{

h = (60.0f * ((b - r) / df) + 120.0f) % 360.0f;

}

else if (mx == b)

{

h = (60.0f * ((r - y) / df) + 240.0f) % 360.0f;

}

else

{

h = 0;

}

if (mx == 0f)

{

s = 0.0f;

}

else

{

s = (df / mx) * 100.0f;

}

v = mx * 100.0f;

return new Vector3(h / 360.0f, s / 100.0f, v / 100.0f);
}
 

Но это дает вам только RYB, который, хотя и полезен для операций, основанных на цветовом круге Иттена, сам по себе бесполезен. Итак, что я сделал, так это конвертировал в HSV, что можно легко сделать, используя любую стандартную функцию RGB в HSV, но где вы передаете «Y» вместо «G».

Реализация C#, опять же полностью взятая отсюда, возможно, вам придется отредактировать ее, чтобы она работала для ваших целей:

private Color RGBToRYB(Color color) { // Remove the white from the color float iWhite = Mathf.Min(color.r, color.g, color.b); float iRed = color.r - iWhite; float iGreen = color.g - iWhite; float iBlue = color.b - iWhite; float iMaxGreen = Mathf.Max(iRed, iGreen, iBlue); // Get the yellow out of the red+green float iYellow = Mathf.Min(iRed, iGreen); iRed -= iYellow; iGreen -= iYellow; // If this unfortunate conversion combines blue and green, then cut each in half to // preserve the value's maximum range. if (iBlue > 0f && iGreen > 0f) { iBlue /= 2f; iGreen /= 2f; } // Redistribute the remaining green. iYellow += iGreen; iBlue += iGreen; // Normalize to values. float iMaxYellow = Mathf.Max(iRed, iYellow, iBlue); if (iMaxYellow > 0f) { float iN = iMaxGreen / iMaxYellow; iRed *= iN; iYellow *= iN; iBlue *= iN; } // Add the white back in. iRed += iWhite; iYellow += iWhite; iBlue += iWhite; return (new Color(iRed, iYellow, iBlue)); }
 

Feentelay20


Рег
22 Dec, 2007

Тем
69

Постов
218

Баллов
573
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно