我想将matplotlib图作为3维RGBA数组。我使用以下代码进行转换:
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
canvas = np.zeros((20, 20))
img = plt.imshow(canvas, interpolation='none').make_image()
h, w, d = img.as_rgba_str()
print(h,w)
rgba_array = np.fromstring(d, dtype=np.uint8).reshape(h, w, 4)
plt.imshow(rgba_array)
Out[1]: (249, 373)
<matplotlib.image.AxesImage at 0x111fa8b10>
为什么宽高比会从原始方阵变化?是否有我可以指定的参数或另一种方法来使图形的rgba阵列保持其原始形状?
答案 0 :(得分:0)
当我在pycharm中执行你的代码时 (353,497) 当我逐行在pycharm中执行你的代码时 (353,353) 当我在ipython中执行你的代码时(来自命令shell) (385,497)
我想
img = plt.imshow(canvas, interpolation='none').make_image()
h, w, d = img.as_rgba_str()
make_image()实际上并没有转换值,但是轴中每个像素都有一个值。因此,如果您的轴在屏幕上显示为正方形,则会选择更高分辨率的正方形。否则只是一些矩形,具体取决于你的后端和屏幕分辨率。
答案 1 :(得分:0)
我找到了一种替代方法,它不使用.imshow()函数并保留大小比例:
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
canvas = np.zeros((20, 20))
img = Image.fromarray(np.uint8(plt.cm.gist_earth(canvas)*255))
rgba_array = np.array(img.getdata(), np.uint8).reshape(img.size[1], img.size[0], 4)
print(rgba_array.shape)
plt.imshow(rgba_array)
Out[1]: (20, 20, 4)
<matplotlib.image.AxesImage at 0x112a71710>
答案 2 :(得分:0)
我认为你可以使用这个答案来实现:https://stackoverflow.com/a/35362787/1072212,而不是canvas.tostring_rgb()
使用canvas.tostring_argb()
(不是..._rgba()
)和
width, height = map(int, fig.get_size_inches() * fig.get_dpi())
image = image.reshape(height, width, 4)
image = np.roll(image, -1, 2)
以后你可能想要
img = Image.fromarray(image, 'RGBA')
img.save('my.png')
img.show()