У меня есть код, который генерирует изображения с закрашенными кружками, которые могут быть одного из 10 цветов, используя plt.fill
, с координатами X и Y, равными circle
за один раз от circle_list
:
for i in range(0, R.shape[0]):
radius = R[i]
circle = circle_list[i]
color = assigned_colors[i]
plt.fill(circle[:, 0], circle[:, 1], facecolor=color)
assigned_colors
- это список той же длины, что и R.shape[0]
(общее количество нарисованных кругов) с одним из цветов, указанных в color_list
:
color_list = [(.14,.33,.49), (.08,.41,.27), (.37,.76,.35), (.92,.58,.13),
(.90,.25,.09), (.96,.75,.12), (.74,.09,.15), (.80,.76,.56),
(.56,.70,.72), (.77,.71,.76)]
Затем я сохраняю это image as a numpy ndarray:
plt.savefig('test.png', dpi=350)
arr = np.fromstring(fig.canvas.tostring_rgb(), dtype=np.uint8, sep='')
arr = arr.reshape(fig.canvas.get_width_height()[::-1] + (3,))
np.save('arr.npy', arr)
Все это прекрасно работает, но для некоторого анализа я бы хотел использовать уникальные значения RGB, указанные для заполнения кругов, в качестве уникальных идентификаторов. Однако, когда я загружаю массив и смотрю на уникальные цвета, я наблюдаю много больше, чем ожидалось:
circles_npy = np.load('./arr.npy')
len(np.unique(circles_npy.reshape(-1, circles_npy.shape[2]), axis=0))
>>> 2854
Если я рисую изображение, оно визуально выглядит как 10 цветов Я указал нарисованные, но почему значения RGB такие разные? Есть ли способ заставить matplotlib использовать только эти точные значения плюс цвет фона? Я ожидал, что это вернет 11 (для 10 возможных цветов плюс белый фон. Я не понимаю, что здесь происходит и как я могу использовать цвета в качестве меток в массиве? В идеале то, что я ищу, является уникальным значением за каждый цвет в массиве изображений.