从matplotlib图像获取RGBA数组

时间:2015-07-13 21:24:33

标签: python matplotlib scipy imshow

我正在使用imshow绘制带有自定义色彩映射和boundarynorm的数组。但是,这将是一个自动脚本,我想保存imshow生成的图像而不使用轴。所以我不确定imshow是最好的方法,因为它将在后台运行。有没有其他选择我可以设置colormap和boundarynorm并生成一个我可以提供给imsave的rgba数组?或者我只是留下了imshow产生并保存的图像?

2 个答案:

答案 0 :(得分:3)

您可以使用as_rgba_str从图像中获取图像数据。这是一个例子:

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 2, 1000)
X, Y = np.meshgrid(x, x)
data = np.sin((X-2)**3 + Y**4)

im = plt.imshow(data)

x = im.make_image()
h, w, d = x.as_rgba_str()
n = np.fromstring(d, dtype=np.uint8).reshape(h, w, 4)

plt.figure()
plt.imshow(n[:,:,0], cmap="gray", origin='lower')

plt.show()

原始图片: enter image description here

RGBA数据中的R通道(注意所有蓝色部分都是黑色的,因为它们中没有红色): enter image description here

答案 1 :(得分:0)

matplotlib.colors.Colormap.__call__执行cmap并返回RGBA数组。 https://matplotlib.org/3.3.1/api/_as_gen/matplotlib.colors.Colormap.html#matplotlib.colors.Colormap.__call__

# created using numpy 1.18.5 and matplotlib 3.2.2
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm, colors

x = np.linspace(0, 2, 1000)
X, Y = np.meshgrid(x, x)
data = np.sin((X-2)**3 + Y**4)
print(f"data.shape: {data.shape}")
print(f"data.dtype: {data.dtype}")

cmap: colors.Colormap = cm.get_cmap("rainbow")
norm: colors.Normalize = colors.Normalize()
# set min and max values from data
norm.autoscale(data)

# move scalar values to range [0, 1]
# can skip and pass directly to cmap if data already [0, 1]
normalised = norm(data)

# create a RBGA array
# bytes=True gives a uint8 array (Unsigned integer 0 to 255)
data_rgba = cmap(normalised, bytes=True)
print(f"data_rgba.shape: {data_rgba.shape}")
print(f"data_rgba.dtype: {data_rgba.dtype}")

# pass RBGA array to imsave and set origin to upper or lower
plt.imsave("my_data.png", data_rgba, origin="lower")

使用matplotlib.cm.ScalarMappable.to_rgba也可以一步完成,但我还没有尝试过。 https://matplotlib.org/3.3.1/api/cm_api.html#matplotlib.cm.ScalarMappable.to_rgba my_data.png