Вычисление среднего значения двух значений RGB

Имея 2 значения RGB:

  • 255, 23, 22
  • 201, 18, 122

Я хочу усреднить их, эта ссылка говорит, что действительно мне нужно сначала возвести их в квадрат, усреднить, а затем найти квадратный корень. Я видел несколько других точек, которые говорят то же самое или ближе к степени 2,2 (и видео о том, почему компьютерный цвет неправильный).

Действительно ли это правильный способ сделать это и как называется метод возведения в квадрат? Я знаю, что НАСТОЯЩИЙ лучший способ — это пространство ЛАБОРАТОРИИ, но я не могу иметь с этим дело.

вы можете прочитать о линейных и гамма-цветовых пространствах.
Я не уверен, что Lab лучше (и да, это L ab с маленькими a и b), потому что на самом деле он не предназначен для имтерполяции, поэтому его можно было бы носить разными способами. Наверное лучше в XYZ

Ответы (3)

Р (255+201)/2 = 228

Г (23+18)/2 = 20,5

В (22+122)/2 = 72

Это будет зависеть от вашего понятия «средний».

Если это среднее значение между черным и белым, я ожидаю, что результат будет 128, а гамма-коррекция будет выполнена видеокартой .

Но перцептивная причина этой связи интересна.

Дело в том, что есть не один способ усреднения, нужно помнить, что цветовое пространство — это 3D-модель, а не линейная.

Взгляните на это другие сообщения, связанные:

В этом посте я показываю 4 разных пути цветового перехода между красным и зеленым... и это только на обычном цветовом круге.

Генерация серии цветов между двумя цветами

Но цвет — это не только двухмерная поверхность, но и твердое тело, имеющее множество форм и моделей.

Как найти обратный цвет?

Таким образом, не существует одного универсального способа усреднения цветов. Это зависит от многих вещей.

так что я прав (вероятно, нет!), что сказать, что взятие rgb и возведение в квадрат (или, предпочтительно, степень 2,2) на самом деле является тем же самым процессом, но учитывает гамму (так что больше соответствует тому, как мы ДЕЙСТВИТЕЛЬНО видим цвет?)
Вероятно, вам нужно будет добавить к вашему вопросу «более правильное восприятие». :)
так что со случаем "более перцептивно правильно" работать с мощностью 2.2, есть ли этому доказательства? Как и везде в Интернете, где говорится, что это более точно, чем просто усреднение?

Вероятно, вам лучше подойдёт компьютерная графика , чем графический дизайн, так как там хлеб с маслом, а здесь слишком много математики. Но раз ты уже здесь. На самом деле оба рассуждения являются близкими приближениями.

Это правда, что изображение нелинейно. Таким образом, вы не можете предполагать, что сложение значений приводит к их сумме, а значит, и не к среднему значению. Если вы хотите быть правы, вам нужно сделать преобразование профиля в профиль *. Технически вы, вероятно, предположили бы, что профиль — это sRGB, что действительно близко к гамма-коррекции 2,2. где гамма определяется как:

V на выходе = V на входе Ɣ

За исключением того, что это не совсем гамма 2,2, потому что она фактически линейна при значениях 0,04045 (или ниже целочисленных значений 10 в 8-битных цветовых каналах). Затем, поскольку цветовые плоскости независимы, вы можете сначала преобразовать его в линейный, а затем вычислить и преобразовать обратно в нелинейный.

* Однако зависит от вашего определения правильности, если это правильно, как в реальной жизни, то на самом деле это не работает. Поскольку цветовые значения, используемые компьютерами, не могут улавливать естественный свет. Вам понадобятся спектральные данные, чтобы сделать это правильно. Но это бесконечная раввинская дыра. Цвет на самом деле не так прост, как думает большинство из нас, это сложнее, чем они могут себе представить.

TL;DR Достаточно хорошо

Видео Minute Physics « Компьютерный цвет сломан » хорошо объясняет проблему, но в нем есть некоторая (небольшая) проблема.

Он отмечает, что RGB работает со сжатой версией фактической интенсивности с квадратным корнем:

+--------------+                      +-----+
| Linear Light |----> √r, √g, √b ---->| RGB |
+--------------+                      +-----+

Итак, прежде чем вы попытаетесь смешать RGB, вам нужно преобразовать его обратно в «линейный свет» , применив обратное:

+--------------+                      +-----+
| Linear Light |<---- r², g², b² <----| RGB |
+--------------+                      +-----+

Но Интернет и почти вся электроника и потребительские устройства согласились со стандартом (называемым sRGB), где они применяют что-то не совсем квадратный корень.

  • То, что вы знаете как квадратный корень, может быть выражено как: r 1/2
  • То, к чему призывает sRGB, близко, но немного отличается: r 1/2,4.

Так что это не совсем квадрат (и квадратный корень, чтобы отменить это).

Компандирование sRGB также нелинейно

Формула, используемая sRGB для преобразования линейного света в закодированный sRGB, является нелинейной:

  • для Rлинейного > 0,0031308
    • R srgb = 1,055×R линейный 1/2,4 - 0,055
  • в противном случае
    • R srgb = 12,92×R линейный

Другими словами, это очень близко к простому извлечению квадратного корня:

введите описание изображения здесь

С единственной ошибкой линейного участка, когда вы спускаетесь очень близко к нулю.

Математика

Поэтому обычно вам нужна функция, которая применяет эту функцию компандирования sRGB с почти квадратным корнем :

r = SrgbCompanding(Rlinear);
g = SrgbCompanding(Glinear);
b = SrgbCompanding(Blinear);

Прежде чем вы начнете усреднять или смешивать цвета в RGB, вам нужно применить обратное:

Rlinear = SrgbInverseCompanding(r);
Glinear = SrgbInverseCompanding(g);
Blinear = SrgbInverseCompanding(b);

Когда ваши R, G и B находятся в линейном свете, вы можете усреднить их:

R3 = (SrgbInverseCompanding(r1) + SrgbInverseCompanding(r2)) / 2;
G3 = (SrgbInverseCompanding(g1) + SrgbInverseCompanding(g2)) / 2;
B3 = (SrgbInverseCompanding(b1) + SrgbInverseCompanding(b2)) / 2;

И тогда вам нужно повторно применить компандирование sRGB:

R3 = SrgbCompanding(R3);
G3 = SrgbCompanding(G3);
B3 = SrgbCompanding(B3);