2025年使用matplotlib.pyplot所画图片的二进制流获取方法以及如何将它转换为图片array(附代码)

使用matplotlib.pyplot所画图片的二进制流获取方法以及如何将它转换为图片array(附代码)时间 2018 11 13 题目 使用 matplotlib pyplot 所画图片的二进制流获取方法以及如何将它转换为图片 array 附代码 概述 在 python 中 可以通过 matplotlib pyplot 进行画图并可以使用 plt savefig save path dpi 进行保存

大家好,我是讯享网,很高兴认识大家。

【时间】2018.11.13

【题目】使用matplotlib.pyplot所画图片的二进制流获取方法以及如何将它转换为图片array(附代码)

概述

在python中,可以通过matplotlib.pyplot进行画图并可以使用plt.savefig(save_path, dpi= ])进行保存,但是要如何才能获取所画的图的数据呢?本文主要是通过输入输出流d的io.BytesIO()方法获得所画的图的二进制流数据,并可以将它转换为array数组,从而更好地获取所画图中的数据。

 

一、实现代码

【代码】

import matplotlib.pyplot as plt import numpy as np import io from PIL import Image import cv2 #使用plt进行画图 img = Image.open('00.jpg') #读取图片像素为512X512 fig=plt.figure("Image",frameon=False)  # 图像窗口名称 plt.imshow(img) canvas = fig.canvas # 去掉图片四周的空白 plt.axis('off') # 关掉坐标轴为 off #设置画布大小(单位为英寸),每1英寸有100个像素 fig.set_size_inches(512/100,512/100) plt.gca().xaxis.set_major_locator(plt.NullLocator())  # plt.gca()表示获取当前子图"Get Current Axes"。 plt.gca().yaxis.set_major_locator(plt.NullLocator()) plt.subplots_adjust(top=1, bottom=0, left=0, right=1, hspace=0, wspace=0) plt.margins(0, 0) #第一种保存方式(直接对plt 进行保存) plt.savefig('01.jpg',dpi=100) # 第二种保存方式(获取Plt的数据并使用cv2进行保存) buffer = io.BytesIO()  # 获取输入输出流对象 canvas.print_png(buffer)  # 将画布上的内容打印到输入输出流对象 data = buffer.getvalue()  # 获取流的值 print("plt的二进制流为:\n",data) buffer.write(data)  # 将数据写入buffer img = Image.open(buffer)  # 使用Image打开图片数据 img = np.asarray(img) print("转换的图片array的尺寸为:\n",img.shape) print("转换的图片array为:\n",img) cv2.imwrite("02.jpg", img) buffer.close()

讯享网

【运行结果】

输入与输出图片:


讯享网

部分print的结果:

二、代码思路分析

2.1使用Image读取图片并用plt进行画图

讯享网#使用plt进行画图 img = Image.open('00.jpg') #读取图片像素为512X512 fig=plt.figure("Image",frameon=False)  # 图像窗口名称 plt.imshow(img) canvas = fig.canvas 

2.2 去掉plt图的白边

plt.axis('off') # 关掉坐标轴为 off #设置画布大小(单位为英寸),每1英寸有100个像素 fig.set_size_inches(512/100,512/100) plt.gca().xaxis.set_major_locator(plt.NullLocator())  # plt.gca()表示获取当前子图"Get Current Axes"。 plt.gca().yaxis.set_major_locator(plt.NullLocator()) plt.subplots_adjust(top=1, bottom=0, left=0, right=1, hspace=0, wspace=0) plt.margins(0, 0)

2.3 获取plt 图的数据

2.3.1  通过 io.BytesIO() 获取输入输出流对象,并通过canvas.print_png(buffer) 将画布上的内容打印到输入输出流对象,最后通过buffer.getvalue()获取流的数据

讯享网buffer = io.BytesIO()  # 获取输入输出流对象 canvas.print_png(buffer)  # 将画布上的内容打印到输入输出流对象 data = buffer.getvalue()  # 获取流的值

2.3.2  将上一步获得的二进制数据转换为array,先将它写入输入输出流,再用Image.open读取获得Image对象,在使用np.asarray将它转换为array

buffer.write(data)  # 将数据写入buffer img = Image.open(buffer)  # 使用Image打开图片数据 img = np.asarray(img)

2.4. 使用cv2.imwrite保存图片

讯享网cv2.imwrite("02.jpg", img)

 

 

 

小讯
上一篇 2025-03-15 23:05
下一篇 2025-03-31 22:51

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/74911.html