Изображение PIL - "ValueError: Индекс диапазона вне диапазона" - PullRequest
0 голосов
/ 18 февраля 2019

Я играю с кодом в этой записной книжке .

Когда я загружаю свои собственные передние планы, для определенных изображений, сохраненных как '.png', я получаю эту ошибку:


ValueError Traceback (последний вызов был последним)

<ipython-input-63-1464e7681a29> in <module>()
     21     foreground_path = random.choice(foregrounds)
     22     background_path = random.choice(backgrounds)
---> 23     composite, mask, bbox = compose_images(foreground_path, background_path)
     24 
     25     composite_path = os.path.join(output_dir, 'image_{0:04d}.png'.format(i))

<ipython-input-47-53344b89732e> in compose_images(foreground_path, background_path)
      4     assert os.path.splitext(foreground_path)[1].lower() == '.png', 'foreground must be a .png file'
      5     foreground = Image.open(foreground_path)
----> 6     foreground_alpha = np.array(foreground.getchannel(3))
      7     assert np.any(foreground_alpha == 0), 'foreground needs to have some transparency: {}'.format(foreground_path)
      8 

~/anaconda3/envs/ctlearn/lib/python3.6/site-packages/PIL/Image.py in getchannel(self, channel)
   2082                     'The image has no channel "{}"'.format(channel))
   2083 
-> 2084         return self._new(self.im.getband(channel))
   2085 
   2086     def tell(self):

ValueError: band index out of range

Таким образом, код виновника - np.array(foreground.getchannel(3)), который, как я полагаю, должен получить альфа-канал целевого изображения.

Это наводит меня на мысль, что в рассматриваемом изображении отсутствует альфа-канал.Но у рассматриваемого изображения действительно есть альфа-слой.

Что происходит?

1 Ответ

0 голосов
/ 18 февраля 2019

Я вижу, что не так.Изображение, которым вы поделились, имеет оттенки серого с альфа-каналом, поэтому оно имеет 2 полосы (LA), а не 4 (RGBA).

Если вы ожидаете 4-канальное изображение RGBA, вы должны преобразовать его в это при открытии.с:

im = Image.open('input.png').convert('RGBA')
...