Определите значения цвета изображения с помощью цветовой палитры, используя PIL / Pillow - PullRequest
1 голос
/ 05 марта 2020

Я пытаюсь определить цвета используемой цветовой палитры изображения с помощью PIL / подушки. Я пробовал следующее:

  • image[x,y]: это даст мне только индексный номер соответствующего пикселя (то есть 1)
  • image.getpixel((x,y)): снова, это даст мне только номер индекса соответствующего пикселя (т.е. 1)
  • image.getcolors(): Это даст мне количество пикселей и их соответствующий номер индекса (то есть [(2, 1), (2, 0)])
  • image.palette: возвращает «объект PIL.ImagePalette.ImagePalette»
  • image.getpalette(): возвращает большой массив (на мой взгляд) не связанных целых чисел (т. Е. [0, 0, 255, 255, 0, 0, 2, 2, 2, 3, 3 ,3 ...])

Как абсолютный запасной вариант, я мог бы преобразовать режим изображения и затем получить значения цвета, но я бы предпочел, если это невозможно.

С этим примером изображения (2x2 пикселя изображение, индексированный режим с 2 цветами, созданными с помощью GIMP, два верхних пикселя - красные (255,0,0), два нижних - синие (0,0,255)), я ожидал что-то вроде:

image.getpalette()
1: (255,0,0)
0: (0,0,255)

Редактировать: Ближайшее, что у меня есть:

image.palette.getdata(): Это дает мне ('RGB;L', b'\x00\x00\xff\xff\x00\x00'). Есть ли способ связать это с индексом. Здесь я думаю, что каждые три байта будут соответствовать одному порядковому номеру.

1 Ответ

2 голосов
/ 05 марта 2020

Вы можете получить и расположить палитру следующим образом:

import numpy as np
from PIL import Image

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

# Get palette and reshape into 3 columns
palette = np.array(im.getpalette(),dtype=np.uint8).reshape((256,3))

Затем просто напечатайте palette.

[[  0   0 255]      <--- first entry is blue
 [255   0   0]      <--- second is red
 [  2   2   2]      <--- grey padding to end
 [  3   3   3]
 [  4   4   4]
 [  5   5   5]
 [  6   6   6]
 ...
 ...
 [253 253 253]
 [254 254 254]
 [255 255 255]]

Если вы хотите посчитать цвета и количество каждого из них Есть, сделать это:

# Convert Image to RGB and make into Numpy array
na = np.array(im.convert('RGB')) 

# Get used colours and counts of each
colours, counts = np.unique(na.reshape(-1,3), axis=0, return_counts=1)    

Это дает colours как:

array([[  0,   0, 255],
       [255,   0,   0]], dtype=uint8)

и counts как:

array([2, 2])
...