Подтвердить что ты не робот

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

Если у меня есть два цвета, определенные их значениями RGB, могу ли я усреднить значения красного, зеленого и синего, а затем объединить, чтобы определить третий цвет, который выглядит как визуальный средний из двух?

ie NewColor = (R1 + R2)/2, (G1 + G2)/2, (B1 + B2)/2

EDIT1: Спасибо за все ответы. Для моих текущих потребностей я имею дело только с цветовыми парами, которые являются оттенками одного цвета, поэтому я думаю, что их усреднение будет работать. Тем не менее, я попытаюсь преобразовать в Lab Space, чтобы убедиться, что предположение верно, и этот метод будет полезен в будущем.

EDIT2: Вот мои результаты FWIW. Color1 и Color2 - это мои два цвета, а два средних столбца - это результаты усреднения в лабораторном пространстве и усреднение RGB соответственно. В этом случае разница между двумя цветами невелика, поэтому различия в выходе из методов усреднения незначительны.

visual comparison of color averaging techniques

4b9b3361

Ответ 1

Взгляните на ответы на этот вопрос.

В принципе, вы хотите преобразовать цвета в нечто, называемое Lab space, и найти их среднее значение в этом пространстве.

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

Ответ 2

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

Но если вам просто нужен быстрый способ взять среднее из двух цветов, это можно сделать в пространстве RGB. Вам просто нужно пропустить предостережение: вы должны скомпоновать значения RGB перед их усреднением, а затем взять корень результата. (Если вы просто берете среднее значение, результат будет слишком темным.)

Вот так:

NewColor = sqrt((R1^2+R2^2)/2),sqrt((G1^2+G2^2)/2),sqrt((B1^2+B2^2)/2)

Здесь отличный vid, который объясняет, почему этот метод эффективен: https://www.youtube.com/watch?v=LKnqECcg6Gw

Ответ 3

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

alt text

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

Ответ 5

Да. Вы можете совместить два цвета вместе. Это подход, используемый OpenGL для объединения цветов вместе (например, при создании карт mip для рендеринга удаленных объектов или рендеринга 50% прозрачной текстуры). Это быстро, просто и "достаточно хорошо" для многих ситуаций. Однако это не совсем реалистично и, вероятно, не будет использоваться на фотографических изображениях.

Ответ 6

Я думаю, ответ от arntjw идет в правильном направлении и распознает логарифмическую подложку, как упоминает Дэн У. Однако правильное геометрическое среднее не является sqrt ((C1 ^ 2 + C2 ^ 2)/2), но sqrt (C1 * C2). Таким образом, средний цвет будет:

NewColor = sqrt(R1*R2),sqrt(G1*G2),sqrt(B1*B2)

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

Ответ 7

Это сложно. Во-первых, набор значений RGB не определяет цвет. Они должны интерпретироваться в свете основных цветов, к которым они относятся (цветового пространства), таких как sRGB, Rec.709, Rec.2020, Adobe RGB (1998) и т.д.

Кроме того, значения RGB, которые мы обычно встречаем с ними, не пропорциональны линейному свету: они "закодированы" с использованием нелинейной функции (гамма). А иногда (в основном в видеообъявлениях) значение "черного" не равно нулю, но смещено от нуля, обычно 16 для 8-битных значений. И "белый" не 255, а 235. sRGB и Rec.709 разделяют праймеры RGB, но их гамма-функции различны.

Преобразование цветового пространства начинается с удаления любого черного смещения, чтобы черный был равен нулю. Если у гамма-функции есть точка останова (например, sRGB и Rec.709), вам нужно тщательно масштабировать значения RGB, чтобы "белый" был равен 1.0.

Затем "декодировать" гамма, выполняя инверсию исходной гамма-функции. (Один ответ предложил возвести в квадрат значения, что является приближением гамма-декодирования.) Теперь у вас есть значения RGB с линейным освещением в некотором цветовом пространстве. На этом этапе вы можете конвертировать из этого цветового пространства в пространство Lab. Большинство конверсий из RGB в Lab проходят промежуточное цветовое пространство под названием XYZ.

Этапы вызова вложенных функций:

Lab = XYZ2Lab (RGB2XYZ (gamma_decode (offset_and_scale (RGB), gammaFunction), цветовое пространство RGB))

(Лабораторное пространство было разработано в 1976 году как попытка создать перцепционно-однородное деформирование стандартного пространства CIE XYZ. (Лув была еще одной попыткой.) Идея состоит в том, что евклидово (прямолинейное) расстояние между двумя цветами (1 "JND" ) будет одинаковым расстоянием для любых двух цветов. Расстояние между двумя цветами в Lab называется "delta-E". Простая формула дельта-евклидова расстояния теперь называется dE76. https://en.wikipedia.org/wiki/Color_difference)

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

Это приблизит вас, но не гарантирует, просто потому, что "цвет" - это человеческое восприятие, а не физическое количество, и, как известно, трудно охарактеризовать надежно. Лаборатория на самом деле не работала так хорошо, что была единообразной. Поэтому вместо того, чтобы исправить Lab, они предложили новую, более сложную функцию delta-E с другим встроенным деком: DE94. Это было лучше, но не идеально, поэтому в 2000 году появилось другое предложение: DE2000. Также лучше, но не идеально. См. Эту страницу Wiki выше для получения дополнительной информации.

Если DE2000 недостаточно хорош (или слишком сложный!), вы можете взглянуть на альтернативу Lab, называемой ICtCp, которая считается более восприимчивым, чем лаборатория.

Ответ 8

На самом деле гораздо более простой способ.

  • Увеличьте изображение до 1px на 1px.

    Цвет 1px - это средний цвет того, что вы масштабировали