使用matplotlib.pyplot所畫圖片的二進位制流獲取方法以及如何將它轉換為圖片array(附程式碼)
阿新 • • 發佈:2018-11-17
【時間】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)