PIL: Как получить индекс палитры для RGB? - PullRequest
1 голос
/ 11 марта 2020

Я хочу перебрать все пиксели данного цвета в изображении PNG (которое я создаю с помощью ). Итеративную часть я могу обработать, но это изображение использует цветовую палитру, поэтому мне нужно получить индекс палитры для данного цвета, в моем случае белый. Обычно это должно работать с функцией ImagePalette.getcolor(), но это говорит мне о том, что палитра находится в необработанном режиме, который я не знаю, как отключить. То, что я делаю, приведено ниже, но должен быть более простой способ.

        import sys
        from PIL import Image
        import numpy as np

        image = Image.open( sys.argv[1] )
        width, height = image.size
        # image.palette.getcolor( (255,255,255) ) # gives ValueError: palette contains raw palette data
        palette = image.getpalette() # a list
        palette = np.reshape( palette, (-1, 3) )
        #rows255, _cols255 = np.where( palette == (255,255,255) ) # gives the same as below - apparently or'ing
        rows255, _cols255 = np.where( palette == 255 )
        whites = []
        count = 1
        prev = -1
        for r in rows255:
            if r==prev:
                count += 1
            else:
                count = 1
            if count==3:
                whites.append( prev )
            prev = r

        print(whites)

Так что мне интересно сделать это напрямую с или правильно использовать numpy.where() для кортежей .

Ситуация должна быть одинаковой с каждым изображением с палитрой, но это один из моих файлов: https://imgur.com/ojul9mf

1 Ответ

1 голос
/ 11 марта 2020

Я не уверен, что на самом деле ваш вопрос, или что вы пытаетесь сделать. Я думаю, что вы хотите получить индекс записи палитры, который соответствует белому.

# Open image
image = Image.open('image.png')

# Extract palette and reshape to 256x3 RGB entries
palette = image.getpalette()
palette = np.reshape( palette, (-1, 3) )

Затем вы узнаете, какие записи палитры являются белыми, а именно первый и последний:

np.all(palette==255,axis=-1)

Out[34]: 
array([ True, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False,  True])

Или, может быть, вы хотите это, что говорит вам то же самое, а именно, что первая и последняя записи белого цвета:

np.where(np.all(palette==255,axis=-1)) 

Out[35]: (array([  0, 255]),)
...