Учитывая триплет R, G, B и фактор F, как рассчитать версию цвета с водяным знаком? - PullRequest
3 голосов
/ 26 октября 2010

У меня есть триплет (R, G, B), где каждый цвет находится в диапазоне от 0,0 до 1,0.Учитывая коэффициент F (0,0 означает исходный цвет, а 1,0 означает белый), я хочу вычислить новый триплет, который является «цветовой меткой» версии цвета.

Я использую следующее выражение (псевдокод):

for each c in R, G, B:
    new_c ← c + F × (1 - c)

Это производит что-то, что выглядит хорошо, но я понимаю, что это вносит отклонения в оттенок цвета (проверка эквивалента HSV до и после преобразования), и я не знаю, если этои следовало ожидать.

Существует ли «стандартный» (с кавычками или без) алгоритм для расчета версии цвета с водяными знаками?Если да, то что это?Если нет, то какие еще алгоритмы для такого же эффекта вы можете мне сказать?

Ответы [ 2 ]

3 голосов
/ 26 октября 2010

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

Это, безусловно, разумно, просто было добиться эффекта водяного знака. Я не знаю других «стандартных», есть несколько способов сделать это.

Альтернативы:
Смешайте с белым, но сделайте это нелинейно на F, например, new_c = c + sqrt(F)*(1-c), или вы можете использовать другие нелинейные функции - это может помочь водяному знаку выглядеть более или менее "плоским".

Вы могли бы сделать это более эффективно, выполнив следующее (где F принимает диапазон 0..INF):

new_c = 1 - (1-c)/pow(2, F)

для реальных значений пикселей (0..255) это будет преобразовано в:

new_c = 255 - (255-c)>>F

Мало того, что это достаточно быстро в целочисленной арифметике, но вы можете делать это и в 32b целых числах параллельно.

0 голосов
/ 26 октября 2010

Почему не просто?

new_c = F*c

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

Для легких формула может быть new_c = 1-Р * (с-1)

...