有时,需要将matplotlib画图的数据图,转化为数据,以进行进一步处理。
方法有两种:
方法一:
总体分为两步完成: 1.将plt或fig对象转为argb string的对象;2.将argb string对象图像转为array 或 Image。
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import numpy as np
from matplotlib.backends.backend_agg import FigureCanvasAgg
# 引入 Image
import PIL.Image as Image
# 将plt转化为numpy数据
canvas = FigureCanvasAgg(plt.gcf())
print(type(canvas))
# 绘制图像
canvas.draw()
# 获取图像尺寸
w, h = canvas.get_width_height()
# 解码string 得到argb图像
buf = np.fromstring(canvas.tostring_argb(), dtype=np.uint8)
# 重构成w h 4(argb)图像
buf.shape = (w, h, 4)
# 转换为 RGBA
buf = np.roll(buf, 3, axis=2)
# 得到 Image RGBA图像对象 (需要Image对象的同学到此为止就可以了)
image = Image.frombytes("RGBA", (w, h), buf.tostring())
# 转换为numpy array rgba四通道数组
image = np.asarray(image)
# 转换为rgb图像
rgb_image = image[:, :, :3]
方法二:
利用matplotlib的savefig()方法,将图片先保存在内存,再用PIL或openCV方法将图片读入。
import matplotlib.pyplot as plt
import pylab
import imageio
import skimage.io
import cv2
from io import BytesIO
import PIL
#申请缓冲地址
buffer_ = BytesIO()#using buffer,great way!
#保存在内存中,而不是在本地磁盘,注意这个默认认为你要保存的就是plt中的内容
plt.savefig(buffer_,format = 'png')
buffer_.seek(0)
#用PIL或CV2从内存中读取
dataPIL = PIL.Image.open(buffer_)
#转换为nparrary,PIL转换就非常快了,data即为所需
data = np.asarray(dataPIL)
#释放缓存
buffer_.close()
cv2.imshow('image', data)
cv2.waitKey()
参考:
Python: Matplotlab 的 figure转换为numpy的arrary方法_搬砖小怪兽的博客-CSDN博客_plt转numpy
Python - 将matplotlib图像转换为numpy.array 或 PIL.Image_苍蓝儿的博客-CSDN博客_matplotlib转numpy