Имея 2 значения RGB:
Я хочу усреднить их, эта ссылка говорит, что действительно мне нужно сначала возвести их в квадрат, усреднить, а затем найти квадратный корень. Я видел несколько других точек, которые говорят то же самое или ближе к степени 2,2 (и видео о том, почему компьютерный цвет неправильный).
Действительно ли это правильный способ сделать это и как называется метод возведения в квадрат? Я знаю, что НАСТОЯЩИЙ лучший способ — это пространство ЛАБОРАТОРИИ, но я не могу иметь с этим дело.
Р (255+201)/2 = 228
Г (23+18)/2 = 20,5
В (22+122)/2 = 72
Это будет зависеть от вашего понятия «средний».
Если это среднее значение между черным и белым, я ожидаю, что результат будет 128, а гамма-коррекция будет выполнена видеокартой .
Но перцептивная причина этой связи интересна.
Дело в том, что есть не один способ усреднения, нужно помнить, что цветовое пространство — это 3D-модель, а не линейная.
Взгляните на это другие сообщения, связанные:
В этом посте я показываю 4 разных пути цветового перехода между красным и зеленым... и это только на обычном цветовом круге.
Генерация серии цветов между двумя цветами
Но цвет — это не только двухмерная поверхность, но и твердое тело, имеющее множество форм и моделей.
Таким образом, не существует одного универсального способа усреднения цветов. Это зависит от многих вещей.
Вероятно, вам лучше подойдёт компьютерная графика , чем графический дизайн, так как там хлеб с маслом, а здесь слишком много математики. Но раз ты уже здесь. На самом деле оба рассуждения являются близкими приближениями.
Это правда, что изображение нелинейно. Таким образом, вы не можете предполагать, что сложение значений приводит к их сумме, а значит, и не к среднему значению. Если вы хотите быть правы, вам нужно сделать преобразование профиля в профиль *. Технически вы, вероятно, предположили бы, что профиль — это 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), где они применяют что-то не совсем квадратный корень.
Так что это не совсем квадрат (и квадратный корень, чтобы отменить это).
Формула, используемая sRGB для преобразования линейного света в закодированный sRGB, является нелинейной:
Другими словами, это очень близко к простому извлечению квадратного корня:
С единственной ошибкой линейного участка, когда вы спускаетесь очень близко к нулю.
Поэтому обычно вам нужна функция, которая применяет эту функцию компандирования 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);
Филипп
джуджа