Как сказал Клин , вы хотите умножить, чтобы сделать вещи ярче, но это работает только до тех пор, пока один из цветов не станет насыщенным (то есть достигнет 255 или больше). В этот момент вы можете просто зафиксировать значения до 255, но вы будете слегка менять цвет по мере того, как становитесь светлее. Чтобы сохранить оттенок, вы должны поддерживать соотношение (средний-низкий) / (самый высокий-самый низкий).
Вот две функции в Python. Первый реализует наивный подход, который просто ограничивает значения RGB до 255, если они превышаются. Вторая перераспределяет избыточные значения, чтобы сохранить нетронутым оттенок.
def clamp_rgb(r, g, b):
return min(255, int(r)), min(255, int(g)), min(255, int(b))
def redistribute_rgb(r, g, b):
threshold = 255.999
m = max(r, g, b)
if m <= threshold:
return int(r), int(g), int(b)
total = r + g + b
if total >= 3 * threshold:
return int(threshold), int(threshold), int(threshold)
x = (3 * threshold - total) / (3 * m - total)
gray = threshold - x * m
return int(gray + x * r), int(gray + x * g), int(gray + x * b)
Я создал градиент, начиная со значения RGB (224,128,0) и умножая его на 1,0, 1,1, 1,2 и т. Д. До 2,0. Верхняя половина - это результат использования clamp_rgb
, а нижняя - результат redistribute_rgb
. Я думаю, что легко видеть, что перераспределение переполнений дает намного лучший результат без необходимости покидать цветовое пространство RGB.
Для сравнения вот тот же градиент в цветовых пространствах HLS и HSV, который реализован модулем Python colorsys
. Был изменен только компонент L
, и результирующие значения RGB были выполнены. Результаты аналогичны, но требуют преобразования цветового пространства для каждого пикселя.