Python - Невозможно распаковать не повторяемый объект int - PullRequest
1 голос
/ 13 января 2020

Я пытаюсь получить пиксель RGB изображения с PIL Image библиотекой.

С этим кодом я столкнулся с ошибкой:

for i in range(width):
    for j in range(height):

        r,g,b=(image.getpixel((i,j))) #THIS LINE IS REFERENCED IN ERROR MESSAGE
        print("leds[",j,"] = CRGB(",r, "," ,g, ",", b, ");") #print pixel colorchange to console

del image

Почему Я получаю эту ошибку? Мне это кажется действительно странным. Я ввожу 2 изображения, и это работает просто отлично. Однако, когда у меня есть белые пиксели в определенной позиции на изображении, я получаю ошибку:

line 18, in <module> 
r,g,b=(image.getpixel((i,j))) #Get pixel at coordinate
TypeError: cannot unpack non-iterable int object

Работающие изображения: ColorCycle , HelloWorld

Изображение, которое не работало: HelloWorld2 Это изображение имеет несколько белых пикселей справа.

Полный код здесь .

1 Ответ

3 голосов
/ 14 января 2020

Проблема заключается в том, что изображение, на которое вы смотрите, не является изображением 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 ошибок), если вы столкнетесь с изображениями, которые используют другие режимы.

...