使用Matplotlib imshow显示网格和自定义颜色创建图像

时间:2018-09-27 15:05:34

标签: python-3.x numpy matplotlib

我正在尝试创建一个图像,其中x轴是宽度,y轴是图像的高度。并且可以根据RBG映射为每个点指定颜色。通过查看Matplotlib中的imshow(),我想我需要在(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()

这会创建一个图,但是如果我的目标是基于somefunc内的x和y值给出特殊的rbg值并将结果的numpy数组转换为N x M x 3数组,我该怎么办

我试图使somefunc函数返回一个要使用的rbg值元组(r,b g),但这似乎不起作用

1 个答案:

答案 0 :(得分:1)

当然,这完全取决于您要使用提供给函数的值来做什么。因此,假设您只想将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