PIL-пиксели - это кортежи, а кортежи неизменны.Вам нужно создать новый кортеж.Поэтому вместо цикла for выполните:
pixels = [(pixel[0] + 20, pixel[1], pixel[2]) for pixel in pixels]
image.putdata(pixels)
Кроме того, если пиксель уже слишком красный, добавление 20 приведет к переполнению значения.Вы, вероятно, хотите что-то вроде min(pixel[0] + 20, 255)
или int(255 * (pixel[0] / 255.) ** 0.9)
вместо pixel[0] + 20
.
. И чтобы иметь возможность обрабатывать изображения во множестве различных форматов, выполните image = image.convert("RGB")
после открытия изображения.Метод convert гарантирует, что пиксели всегда являются (r, g, b) кортежами.