保存图像_06 - matplotlib中应知应会numpy存储、交换图像
matplotlib中應(yīng)知應(yīng)會(huì)numpy存儲(chǔ)、交換圖像
numpy的ndarray是mpl官方推薦的輸入數(shù)據(jù)結(jié)構(gòu)
mpl官方推薦繪圖時(shí),應(yīng)以numpy的ndarray數(shù)據(jù)結(jié)構(gòu)輸入數(shù)據(jù)。雖然有時(shí)用pandas中的兩個(gè)數(shù)據(jù)結(jié)構(gòu)、python的list等數(shù)據(jù)結(jié)構(gòu)也可以,但不能保證都能成功。
這是因?yàn)閚umpy的ndarray的結(jié)構(gòu)設(shè)計(jì)天生具有保存、交換、變換圖像數(shù)據(jù)的優(yōu)勢(shì)。
本篇:
- 將一幅image轉(zhuǎn)換為ndarray保存起來(lái);
- 再在mpl的fig中讀取保存的ndarray,并顯示出該image;
- 并分析ndarray保存image的基本思想。
在mpl中,很多對(duì)象的一些參數(shù)設(shè)置都要借助ndarray的變換來(lái)實(shí)現(xiàn)一些繪圖效果。因此理解ndarray保存圖像,對(duì)后面學(xué)習(xí)相關(guān)內(nèi)容非常有幫助。
閱讀前兩篇關(guān)于像素和分辨率的文章,會(huì)讓你閱讀本篇更輕松。
將一幅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庫(kù)的支持
上面的代碼完成了這么幾件事:
ndarray保存圖像的方式解析
上面的第4個(gè)任務(wù)顯示,圖像數(shù)據(jù)被保存在一個(gè)(344, 250, 3)的3維數(shù)組中。
你如果讀了上一篇,應(yīng)該記得,這個(gè)(344, 250)正是該image的像素大小:
沒(méi)錯(cuò),numpy就是用這樣一個(gè)3維數(shù)組保存image數(shù)據(jù)的:
- image高度上的像素個(gè)數(shù)是ndarray的行數(shù),這里是344行;
- image寬度上的像素個(gè)數(shù)是ndarray的列數(shù),這里是255列;
- 行列交叉位置,就是圖像的坐標(biāo)位置了,即每個(gè)像素單元格上,再用一個(gè)有3個(gè)元素一維數(shù)組表示該像素的顏色 [R, G, B] 值。
如下圖所示,每個(gè)格子是一個(gè)像素,每個(gè)格子上的3元素的列表就是該像素上的 [R, G, B] 值。
使用:im_ar[12][27]檢索,返回一個(gè)array([247, 176, 148]我們就知道第13行,第28列上的像素的顏色是 [247, 176, 148],在配色軟件上檢索這個(gè)值:
[247, 276, 168]
numpy就是這樣用ndarray保存image的。是不是豁然開(kāi)朗了!
讀取ndarray,顯示出圖像
我將生存的ndarray數(shù)據(jù)文件放到了"Python草堂"群文件的DataSets文件中,供大家下載。
輸入如下代碼:
注意:這是純面向?qū)ο罄L圖的代碼,所以看起來(lái)代碼比較多,但每一步在做什么,我都很清楚。
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存储、交换图像的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Linux导出函数控制,linux 下仅
- 下一篇: java面试常考_JAVA面试常考系列十