Как я могу составить список цветов? - PullRequest
2 голосов
/ 10 июля 2020

Здравствуйте, я пытаюсь построить список цветов в следующем формате:

img = cv2.imread('./img/a.png')
ground = cv2.imread('./img/b.png')

descriptor = [img[ij] for ij in np.ndindex(ground.shape[:2]) if all(ground[ij])]
descriptor[0]
array([ 72,  70, 115], dtype=uint8)

Я хочу получить такую ​​диаграмму:

введите описание изображения здесь

Для этого я использую график рассеяния следующим образом:

fig = plt.figure()
axis = fig.add_subplot(1, 1, 1, projection="3d")
axis.scatter(descriptor[0],descriptor[0],descriptor[0], facecolors=descriptor, marker=".")
plt.show()

Но я получаю следующую ошибку:

ValueError: аргумент 'c' должен быть mpl-цветом, последовательностью mpl-цветов или последовательностью чисел, а не [array ([72, 70, 115]

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

descriptor = [list(img[ij]) for ij in np.ndindex(ground.shape[:2]) if all(ground[ij])]
descriptor[0]
[ 72,  70, 115]

Я получаю эту ошибку:

'c' аргумент должен быть цветом mpl, последовательностью цветов mpl или последовательностью чисел, а не [[72, 70, 115], [71, 69, 114]

Как я могу построить список как диаграмму?

Спасибо

a = [np.random.randint(10,240,3) for _ in range(20)]
descriptor = a

1 Ответ

2 голосов
/ 10 июля 2020

Учитывая, что дескриптор представляет собой двумерный массив, состоящий из [r, g, b] значений для каждой точки:

  1. Вы даете все 3 координаты для каждой точки для всех 3 параметра x, y, z в функции scatter (). Вместо descriptor[0], descriptor[0], descriptor[0] вам нужно получить доступ descriptor[:,0], descriptor[:,1], descriptor[:,2] к пользовательским значениям r, g и b соответственно для координат x, y и z.

  2. Matplotlib принимает двумерный массив кортежей значений r, g, b как цвет, но они должны находиться в диапазоне [0,1], поэтому color = descirptor/255

Это мой код:

color = descriptor/255
fig = plt.figure()
axis = fig.add_subplot(111, projection = '3d')
axis.scatter(descriptor[:,0],descriptor[:,1],descriptor[:,2], facecolor = color, marker = 'o')
axis.set_xlim(0,255)
axis.set_ylim(0,255)
axis.set_zlim(0,255)

С образцами данных:

descriptor = np.array([[70,70,115],[112,255,95],[0,0,0],[255,255,255],[125,125,125],[255,0,0],[0,255,0],[0,0,255],[255,255,0],[0,255,255],[255,0,255]])

Вывод:

введите описание изображения здесь

Изменить: с учетом данных вашего примера

a = [np.random.randint(10,240,3) for _ in range(20)]
descriptor = a

Вам нужно сначала изменить тип данных массива на numpy (чтобы использовать многомерное индексирование ) так:

descriptor = numpy.array(a)
...