Я не думаю, что ваш алгоритм или принятый ответ верны - вы увидите это, если создадите массив pixels
как uint8
(а не int64
, как он есть в настоящее время), который, вероятно, соответствует вашему Имеется, если вы ограничиваете выходы диапазоном 0..255.
Вам необходимо трактовать оттенок иначе, чем насыщенность и легкость. Оттенок является круглым, что означает, что он «оборачивается» кругом 0..255 «градусов» . Это означает, что когда он достигает 255 и вы добавляете 1, вы должны вернуться к нулю и снова набрать go. Математически это означает модуль %
. Насыщенность и яркость не круглые, это означает, что если изображение почти полностью яркое, скажем, 250, если вы добавите 100 к яркости, оно должно "выгореть" на максимуме. Математически это «отсечение» . Аналогично с Насыщением.
Итак, я полагаю, вы хотите что-то более похожее на это:
#!/usr/bin/env python3
import numpy as np
def make_edit(im, hue, sat, lum):
# Make signed and larger to accommodate wrap-around
im = im.astype(np.int32)
# Add constant amount of hue to each pixel, wrapping around at 255
im[:,:,0] = (im[:,:,0] + hue) % 256
# Add constant amount of saturation, and lightness to each pixel
im[:,:,1] += sat
im[:,:,2] += lum
# Clip results to range 0..255 and return as uint8
return np.clip(im,0,255).astype(np.uint8)
# Make our randomness deterministic!
np.random.seed(42)
# Create 4x2 array of HSL pixels - note UINT8
im = np.random.randint(0,255,(2,4,3),dtype=np.uint8)
# array([[[102, 220, 225],
# [ 95, 179, 61],
# [234, 203, 92],
# [ 3, 98, 243]],
#
# [[ 14, 149, 245],
# [ 46, 106, 244],
# [ 99, 187, 71],
# [212, 153, 199]]], dtype=uint8)
res = make_edit(im, 100, 50, 20)
print(res)
#[[[202 255 245]
# [195 229 81]
# [ 78 253 112]
# [103 148 255]]
#
# [[114 199 255]
# [146 156 255]
# [199 237 91]
# [ 56 203 219]]]
res = make_edit(im, -100, -50, -20)
print(res)
#[[[ 2 170 205]
# [251 129 41]
# [134 153 72]
# [159 48 223]]
#
# [[170 99 225]
# [202 56 224]
# [255 137 51]
# [112 103 179]]]
Обратите внимание, что вы можете использовать ImageMagick , если вы хотите проверить ваш код, просто запустив команды в терминале. Вы можете использовать оператор -модулировать следующим образом:
magick INPUTIMAGE -modulate BRIGHTNESS,SATURATION,HUE OUTPUTIMAGE
Например, чтобы уменьшить яркость вдвое:
magick input.png -modulate 50 result.jpg
Чтобы оставить яркость без изменений на 100% его предыдущего значения, увеличьте насыщенность на 20% и поверните оттенок на 90 градусов против часовой стрелки (потому что 50% из 180 - это 90):
magic input.png -modulate 100,120,50 result.jpg
Ключевые слова : Python, обработка изображений, поворот оттенков, HSL, HSV, модуляция.