Проблема заключается в том, что изображение, на которое вы смотрите, не является изображением RGB. Если вы посмотрите на image.getbands()
или image.mode
, вы увидите, что изображение находится в режиме P
, в режиме палитры .
В этом режиме вместо сохранения значений цвета значения непосредственно для каждого пикселя, каждый пиксель хранит одно число, которое является индексом в палитре изображения, которая доступна через getpalette
. Сама палитра может быть в разных «режимах», но для этого конкретного изображения это RGB-палитра вида [r0, g0, b0, r1, g1, b1, ...]
.
Таким образом, один из способов получить фактические значения пикселей изображения будет проверить режим и вручную получить значения r
, g
, b
,
palette = image.getpalette()
for i in range(width):
for j in range(height):
index = image.getpixel((i, j)) # index in the palette
base = 3 * index # because each palette color has 3 components
r, g, b = palette[base:base+3]
Однако в этом случае имеется ярлык; Вы можете конвертировать между режимами, используя метко названную convert
функцию .
rgb_image = image.convert('RGB')
Обратите внимание, однако, что использование convert
вслепую может иметь непредвиденные последствия (возможно, без каких-либо Python ошибок), если вы столкнетесь с изображениями, которые используют другие режимы.