Построение нерегулярно 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?

Другие вопросы по тегам