保存图像_06 - matplotlib中应知应会numpy存储、交换图像
matplotlib中應(yīng)知應(yīng)會numpy存儲、交換圖像
numpy的ndarray是mpl官方推薦的輸入數(shù)據(jù)結(jié)構(gòu)
mpl官方推薦繪圖時,應(yīng)以numpy的ndarray數(shù)據(jù)結(jié)構(gòu)輸入數(shù)據(jù)。雖然有時用pandas中的兩個數(shù)據(jù)結(jié)構(gòu)、python的list等數(shù)據(jù)結(jié)構(gòu)也可以,但不能保證都能成功。
這是因為numpy的ndarray的結(jié)構(gòu)設(shè)計天生具有保存、交換、變換圖像數(shù)據(jù)的優(yōu)勢。
本篇:
- 將一幅image轉(zhuǎn)換為ndarray保存起來;
- 再在mpl的fig中讀取保存的ndarray,并顯示出該image;
- 并分析ndarray保存image的基本思想。
在mpl中,很多對象的一些參數(shù)設(shè)置都要借助ndarray的變換來實現(xiàn)一些繪圖效果。因此理解ndarray保存圖像,對后面學(xué)習(xí)相關(guān)內(nèi)容非常有幫助。
閱讀前兩篇關(guān)于像素和分辨率的文章,會讓你閱讀本篇更輕松。
將一幅image存入ndarray
仍然以上篇中用到的這幅image為例:原圖像可以到"Python草堂“QQ群下載。
img2array.jpg
輸入如下代碼:
import numpy as npfrom PIL import Imageim_source = Image.open('./assets/img2array.jpg') #應(yīng)該修改成你的image保存的路徑im_ar = np.array(im_source)np.save('./assets/imgdata.npy',im_ar)# 同樣要修改為你保存數(shù)據(jù)文件的目錄im_ar.shape注意:上面的代碼需要Python的 PIL庫的支持
上面的代碼完成了這么幾件事:
ndarray保存圖像的方式解析
上面的第4個任務(wù)顯示,圖像數(shù)據(jù)被保存在一個(344, 250, 3)的3維數(shù)組中。
你如果讀了上一篇,應(yīng)該記得,這個(344, 250)正是該image的像素大小:
沒錯,numpy就是用這樣一個3維數(shù)組保存image數(shù)據(jù)的:
- image高度上的像素個數(shù)是ndarray的行數(shù),這里是344行;
- image寬度上的像素個數(shù)是ndarray的列數(shù),這里是255列;
- 行列交叉位置,就是圖像的坐標位置了,即每個像素單元格上,再用一個有3個元素一維數(shù)組表示該像素的顏色 [R, G, B] 值。
如下圖所示,每個格子是一個像素,每個格子上的3元素的列表就是該像素上的 [R, G, B] 值。
使用:im_ar[12][27]檢索,返回一個array([247, 176, 148]我們就知道第13行,第28列上的像素的顏色是 [247, 176, 148],在配色軟件上檢索這個值:
[247, 276, 168]
numpy就是這樣用ndarray保存image的。是不是豁然開朗了!
讀取ndarray,顯示出圖像
我將生存的ndarray數(shù)據(jù)文件放到了"Python草堂"群文件的DataSets文件中,供大家下載。
輸入如下代碼:
注意:這是純面向?qū)ο罄L圖的代碼,所以看起來代碼比較多,但每一步在做什么,我都很清楚。
from matplotlib.backends.backend_agg import FigureCanvasAggfrom matplotlib.figure import Figure,SubplotParamsimport numpy as npfig =Figure(figsize=(1.1,1.4), dpi=300, facecolor=(239/256,239/256,239/256), edgecolor=(82/256,101/256,155/256), linewidth=2.0, frameon=True, )canvas = FigureCanvasAgg(fig)imgdata = np.load('./assets/imgdata.npy',)fig.figimage(imgdata,xo=40,yo=30,origin='upper')s, (width, height) = canvas.print_to_buffer() from PIL import Imageim = Image.frombytes("RGBA總結(jié)
以上是生活随笔為你收集整理的保存图像_06 - matplotlib中应知应会numpy存储、交换图像的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux导出函数控制,linux 下仅
- 下一篇: c++ 函数指针_进化论——从函数指针到