Построение нерегулярно RGB-изображения в Python
Я хочу нанести несколько изображений RGB на один набор осей с помощью matplotlib. Сначала я попытался использовать imshow для этого, но, похоже, он не обрабатывает два изображения на одном наборе осей с разными экстентами (когда я строю второе изображение, первое исчезает). Я думаю, что ответ здесь заключается в использовании pcolormesh, как в Как построить нерегулярное RGB-изображение с разнесением, используя python и basemap?
Однако, похоже, это не работает для меня - цвет, полученный из сопоставляемого (то есть массива данных, который я передаю в pcolormesh, и указанную мной карту), переопределяет цвет лица, который я указываю. Края сетки имеют правильный цвет, но не грани.
Кто-нибудь знает, как напрямую установить цвет лица? В идеале я бы использовал pcolormesh, который принимает массив n*m*3 в качестве альтернативы n*m, как imshow...
Минимальный пример того, как я хотел бы, чтобы это работало: импорт numpy как np import matplotlib.pyplot как plt
#make some sample data
x, y = np.meshgrid(np.linspace(0,255,1),np.linspace(0,255,1))
r, g = np.meshgrid(np.linspace(0,255,100),np.linspace(0,255,120))
b=255-r
#this is now an RGB array, 100x100x3 that I want to display
rgb = np.array([r,g,b]).T
m = plt.pcolormesh(x, y, rgb/255.0, linewidth=0)
plt.show()
Проблема в том, что вызов plt.pcolormesh завершается неудачно, с
numRows, numCols = C.shape
ValueError: too many values to unpack
Я предполагаю, что это потому, что он хочет 2D-массив, а не 3D-массив с последним измерением длиной 3.
2 ответа
Решение было очень простым: единственное, что мне нужно было сделать, это не было в вопросе, с которым я связан, это удалить массив из объекта сетки. Минимальный пример, если это полезно для других:
import numpy as np
import matplotlib.pyplot as plt
#make some sample data
r, g = np.meshgrid(np.linspace(0,255,100),np.linspace(0,255,100))
b=255-r
#this is now an RGB array, 100x100x3 that I want to display
rgb = np.array([r,g,b]).T
color_tuple = rgb.transpose((1,0,2)).reshape((rgb.shape[0]*rgb.shape[1],rgb.shape[2]))/255.0
m = plt.pcolormesh(r, color=color_tuple, linewidth=0)
m.set_array(None)
plt.show()
Я предполагаю, что строка color_tuple может быть неочевидной: по сути, нам нужно превратить массив (n, m, 3) в массив (n*m, 3). Я думаю, что транспонирование необходимо, чтобы все соответствовало правильно. Также стоит отметить, что цвета, которые мы передаем, должны быть с плавающей точкой, от 0 до 1.
Как насчет объединения всех ваших изображений в один большой массив, который вы затем отображаете с помощью imshow?