Matplotlib的imshow
可以很好地绘制一个numpy数组。这段代码最好地说明了这一点:
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
rows, cols = 200, 200
mat = np.zeros ((rows, cols))
for r in range(rows):
for c in range(cols):
mat[r, c] = r * c
# Handle with matplotlib
plt.imshow(mat)
和它创建的数字:,这是我想要的。我想要的是没有轴的图像,所以通过谷歌搜索我能够组装这个功能:
def create_img (image, w, h):
fig = plt.figure(figsize=(w, h), frameon=False)
canvas = FigureCanvas(fig)
#To make the content fill the whole figure
ax = plt.Axes(fig, [0., 0., 1., 1.])
ax.set_axis_off()
fig.add_axes(ax)
plt.grid(False)
ax.imshow(image, aspect='auto', cmap='viridis')
canvas.draw()
buf = fig.canvas.tostring_rgb()
ncols, nrows = fig.canvas.get_width_height()
a = np.fromstring(buf, dtype=np.uint8).reshape(nrows, ncols, 3)
plt.close()
plt.pause(0.01)
return Image.fromarray(a)
它从numpy矩阵生成图像。它几乎没有绘制。它绘制了一小段时间,但随后图像关闭。我接下来可以保存图像这是所有这些麻烦的原因。
我想知道是否有更简单的方法来达到同一目标。我尝试使用枕头,在第一个例子的代码后添加了一些陈述:
# Handle with pillow.Image
img = Image.fromarray(mat, 'RGB')
img.show()
img.save('/home/user/tmp/figure.png')
但这会产生一种不全面的形象。可能是由于我的一些错误,但我不知道哪个。
我不知道如何通过其他方式获得具有类似imshow
类似输出的numpy数组的图像,例如通过枕头。有人知道如何在没有闪烁图的情况下以与matplotlibs imshow()
相同的方式从numpy矩阵生成图像吗?并且以比我用create_img
函数编写的更简单的方式?
答案 0 :(得分:3)
这个简单的案例最好由plt.imsave
处理。
import matplotlib.pyplot as plt
import numpy as np
rows, cols = 200, 200
r,c = np.meshgrid(np.arange(rows), np.arange(cols))
mat = r*c
# saving as image
plt.imsave("output.png", mat)
# or in some other format
# plt.imsave("output.jpg", mat, format="jpg")