Попытка отобразить список значений RGB - PullRequest
3 голосов
/ 10 мая 2019

У меня есть список barColors, полный значений RGB, которые я пытаюсь построить:

[(120.0304, 117.9008, 122.6944),
 (66.3952, 65.0592, 69.088),
 (22.2944, 24.3504, 26.5872),
 (22.5744, 24.8352, 26.9152),
 (0.0, 0.0, 0.0),
 (94.864, 81.6416, 67.2272),
 (92.5328, 79.6288, 66.2928),
 (102.104, 86.7856, 71.3408),
 (77.664, 65.0288, 52.712),
 (78.2688, 69.3488, 60.1936),
 (19.0432, 17.696, 17.7792),
 (20.0432, 22.4064, 27.5456),
 (30.7776, 32.4288, 36.5024),
 (46.192, 49.8928, 54.7008),
 (45.8016, 48.328, 55.1968),
.
.
.

Я хотел бы создать изображение с вертикальными срезами для каждого цвета (строки) в спискеbarColors.

Я пробовал:

title = "p"
#creating bar image
barImg = Image.new("RGB",(len(barColors), max([1,int(len(barColors)/2.5)])))

#adding bars to the image
barFullData = [x for x in barColors] * barImg.size[1]
barImg.putdata(barFullData)

#folder to store bar images
if not os.path.isdir("bars"):
    os.mkdir("bars")


#saving image
barImg.save("bars/{}_{}.png".format(title,method))
barImg.show()

, но получаю ошибку:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-42-5a3d9f5e3a90> in <module>()
      5 #adding bars to the image
      6 barFullData = [x for x in barColors] * barImg.size[1]
----> 7 barImg.putdata(barFullData)
      8 
      9 #folder to store bar images

C:\Users\meezy\Anaconda3\lib\site-packages\PIL\Image.py in putdata(self, data, scale, offset)
   1456             self._copy()
   1457 
-> 1458         self.im.putdata(data, scale, offset)
   1459 
   1460     def putpalette(self, data, rawmode="RGB"):

TypeError: integer argument expected, got float

Ответы [ 3 ]

1 голос
/ 10 мая 2019

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

import numpy as np
from PIL import Image

barColors = [(120.0304, 117.9008, 122.6944),
             (66.3952, 65.0592, 69.088),
             (22.2944, 24.3504, 26.5872),
             (22.5744, 24.8352, 26.9152),
             (0.0, 0.0, 0.0),
             (94.864, 81.6416, 67.2272),
             (92.5328, 79.6288, 66.2928),
             (102.104, 86.7856, 71.3408),
             (77.664, 65.0288, 52.712),
             (78.2688, 69.3488, 60.1936),
             (19.0432, 17.696, 17.7792),
             (20.0432, 22.4064, 27.5456),
             (30.7776, 32.4288, 36.5024),
             (46.192, 49.8928, 54.7008),
             (45.8016, 48.328, 55.1968)]

barColors = (np.array(barColors)).astype(np.uint8)

title = "p"
#creating bar image
cols = len(barColors)
rows = max([1,int(cols/2.5)])

# Create color Array
barFullData = np.tile(barColors, (rows,1)).reshape(rows, cols, 3)
# Create Image from Array
barImg = Image.fromarray(barFullData, 'RGB')

#saving image
barImg.save("{}_{}.png".format(title,"method"))
barImg.show()

enter image description here

Увеличенная версия:

enter image description here

1 голос
/ 10 мая 2019

В дополнение к приведенным ответам можно использовать еще один вариант palplot.

import seaborn as sns
colors = np.array([
 (120.0304, 117.9008, 122.6944),
 (66.3952, 65.0592, 69.088),
 (22.2944, 24.3504, 26.5872),
 (22.5744, 24.8352, 26.9152),
 (0.0, 0.0, 0.0),
 (94.864, 81.6416, 67.2272),
 (92.5328, 79.6288, 66.2928),
 (102.104, 86.7856, 71.3408),
 (77.664, 65.0288, 52.712),
 (78.2688, 69.3488, 60.1936),
 (19.0432, 17.696, 17.7792),
 (20.0432, 22.4064, 27.5456),
 (30.7776, 32.4288, 36.5024),
 (46.192, 49.8928, 54.7008),
 (45.8016, 48.328, 55.1968)]) / 255.0

sns.palplot(colors)

вертикальные полосы цветов

Я получил изображение после перетаскивания окна графика на соответствующую ширину и высоту. palplot имеет параметр size, который контролирует высоту. Сохранить число, используя fig = plt.gcf(), а затем fig.savefig или непосредственно используя plt.savefig()

Надеюсь, это поможет.

1 голос
/ 10 мая 2019

Вы можете использовать axvspan, чтобы построить одну полосу для каждого цвета:

from matplotlib import pyplot as plt

scaled_colours = [[color / 255 for color in row] for row in colours]

fig, ax = plt.subplots(figsize=(6, 6))

ax.axis(xmin=0, xmax=len(scaled_colours))
ax.tick_params(left=False, labelleft=False, bottom=False, labelbottom=False)

for index, colour in enumerate(scaled_colours):
    ax.axvspan(index, index + 1, color=colour)

Обратите внимание, что если исходные значения цвета floats, их необходимо уменьшить до диапазона [0, 1].

Выход:

enter image description here

Затем вы можете сохранить результат с помощью fig.savefig.

...