Ваш расчетный код для получения коэффициента кажется нормальным, обработка каждого пикселя для получения среднего значения суммы средних.
Однако ваш код модификации для регулировки яркости не выполняется в пределах аналогично l oop, поэтому он будет работать на один пиксель, и я даже не уверен, что пиксель даже в изображении. Вы должны сделать это также в пределах al oop:
for i in range(img_width):
for j in range(img_height):
(r, g, b) = pixels[i, j]
pixels[i, j] = (r * x, g * x, b * x)
Это должно заменить третье-последнее и второе-последнее строки того, что у вас есть в данный момент (между x = ...
и return ...
) , В итоге вы получите:
img_width, img_height = img.size
pixels = img.load() # create the pixel map
h = 0
for i in range(img_width):
for j in range(img_height):
r, g, b = pixels[i, j]
avg = sum(pixels[i, j]) / 3
h += avg
total_avg = int(h / (img_width * img_height))
x = 128 // total_avg
# == New stuff below
for i in range(img_width):
for j in range(img_height):
(r, g, b) = pixels[i, j]
pixels[i, j] = (r * x, g * x, b * x)
# == New stuff above
return img
Несколько других вещей, на которые стоит обратить внимание:
Во-первых, я не уверен, что возвращение img
является здесь нужно делать правильно, если только pixels
не является ссылкой (а не копией) пикселей на изображении. Вы также можете проверить это.
Кроме того, может возможно, что значение для [rgb] * x
даст вам что-то на 1027 * больше , чем 255 наверняка наборы входных данных. Если это так, вы, вероятно, захотите зафиксировать их в диапазоне 0..255
, чтобы этого не произошло. Что-то вроде (замена «нового материала» в коде выше):
for i in range(img_width):
for j in range(img_height):
# Get original pixel.
(r, g, b) = pixels[i, j]
# Scale with upper limit.
r = min(255, r * x)
g = min(255, g * x)
b = min(255, b * x)
# Replace pixel with scaled one.
pixels[i, j] = (r, g, b)