从 matplotlib 图像中获取 RGBA 数组
Getting an RGBA array from a matplotlib image
我正在使用 imshow
绘制具有自定义颜色图和 boundarynorm 的数组。但是,这将是一个自动化脚本,我想保存由 imshow
生成的没有轴的图像。所以我不确定 imshow
是最好的方法,因为它会在后台 运行。是否有替代方案,我可以只设置颜色图和 boundarynorm 并生成一个我可以提供给 imsave
的 rgba 数组?还是我只剩下破解 imshow
制作并保存的图像?
您可以使用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()
原图:
来自 RGBA 数据的 R 通道(注意所有蓝色部分都是黑色的,因为它们中没有红色):
matplotlib.colors.Colormap.__call__
执行 cmap,returns 执行 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
我正在使用 imshow
绘制具有自定义颜色图和 boundarynorm 的数组。但是,这将是一个自动化脚本,我想保存由 imshow
生成的没有轴的图像。所以我不确定 imshow
是最好的方法,因为它会在后台 运行。是否有替代方案,我可以只设置颜色图和 boundarynorm 并生成一个我可以提供给 imsave
的 rgba 数组?还是我只剩下破解 imshow
制作并保存的图像?
您可以使用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()
原图:
来自 RGBA 数据的 R 通道(注意所有蓝色部分都是黑色的,因为它们中没有红色):
matplotlib.colors.Colormap.__call__
执行 cmap,returns 执行 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