1. 程式人生 > >使用matplotlib.pyplot所畫圖片的二進位制流獲取方法以及如何將它轉換為圖片array(附程式碼)

使用matplotlib.pyplot所畫圖片的二進位制流獲取方法以及如何將它轉換為圖片array(附程式碼)

【時間】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)