Создание изображения с использованием сетки сетки Matplotlib imshow и пользовательских цветов - PullRequest
0 голосов
/ 27 сентября 2018

Я пытаюсь создать изображение, где ось x - это ширина, а ось y - это высота изображения.И где каждой точке может быть присвоен цвет на основе отображения RBG.Глядя на imshow () из Matplotlib, я думаю, мне нужно создать сетку на форме (NxMx3), где 3 - это кортеж или что-то похожее на цвета rbg.

Но до сих пор мне не удалось понять, как это сделать.Допустим, у меня есть этот пример:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import LinearSegmentedColormap

x_min = 1 
x_max = 5
y_min = 1 
y_max = 5
Nx = 5 #number of steps for x axis
Ny = 5 #number of steps for y axis

x = np.linspace(x_min, x_max, Nx)
y = np.linspace(y_min, y_max, Ny)

#Can then create a meshgrid using this to get the x and y axis system
xx, yy = np.meshgrid(x, y)

#imagine I have some funcion that does someting based on the x and y values
def somefunc(x_value, y_value):
    #do something and return rbg based on that
    return x_value + y_value

res = somefunc(xx, yy)

cmap = LinearSegmentedColormap.from_list('mycmap', ['white', 'blue', 'black'])
plt.figure(dpi=100)
plt.imshow(res, cmap=cmap, interpolation='bilinear')

plt.show()

И это создает график, но что бы я должен был сделать, если бы моей целью было дать специальные значения rbg на основе значений x и y внутри somefunc и сделать результатмассив num M x 3

Я пытался заставить функцию somefunc возвращать набор значений rbg для использования (r, bg), но это не похоже на работу

1 Ответ

0 голосов
/ 28 сентября 2018

Конечно, это будет полностью зависеть от того, что вы хотите сделать со значениями, которые вы предоставляете функции.Итак, давайте предположим, что вы просто хотите поместить значения x как красный канал и значения y как синий канал, это может выглядеть как

def somefunc(x_value, y_value):
    return np.dstack((x_value/5., np.zeros_like(x_value), y_value/5.))

Полный пример:

import numpy as np
import matplotlib.pyplot as plt

x_min = 1 
x_max = 5
y_min = 1 
y_max = 5
Nx = 5 #number of steps for x axis
Ny = 5 #number of steps for y axis

x = np.linspace(x_min, x_max, Nx)
y = np.linspace(y_min, y_max, Ny)

#Can then create a meshgrid using this to get the x and y axis system
xx, yy = np.meshgrid(x, y)

#imagine I have some funcion that does someting based on the x and y values
def somefunc(x_value, y_value):
    return np.dstack((x_value/5., np.zeros_like(x_value), y_value/5.))


res = somefunc(xx, yy)

plt.figure(dpi=100)
plt.imshow(res)

plt.show()

enter image description here

Если у вас уже есть (более сложная) функция, которая возвращает кортеж RGB, вы можете перебрать сетку, чтобы заполнить пустой массив значениями функции.

#If you already have some function that returns an RGB tuple
def somefunc(x_value, y_value):
    if x_value > 2 and y_value < 3:
        return np.array(((y_value+1)/4., (y_value+2)/5., 0.43))
    elif x_value <=2:
        return np.array((y_value/5., (x_value+3)/5., 0.0))
    else:
        return np.array((x_value/5., (y_value+5)/10., 0.89))
# you may loop over the grid to fill a new array with those values
res = np.zeros((xx.shape[0],xx.shape[1],3))
for i in range(xx.shape[0]):
    for j in range(xx.shape[1]):
        res[i,j,:] = somefunc(xx[i,j],yy[i,j])



plt.figure(dpi=100)
plt.imshow(res)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...