使用Python讀取二進(jìn)制文件的實(shí)例講解
目標(biāo):目標(biāo)文件為一個(gè)float32型存儲(chǔ)的二進(jìn)制文件,按列優(yōu)先方式存儲(chǔ)。本文使用Python讀取該二進(jìn)制文件并使用matplotlib.pyplot相關(guān)工具畫(huà)出圖像
工具:Python3, matplotlib,os,struct,numpy
1. 讀取二進(jìn)制文件
首先使用open函數(shù)打開(kāi)文件,打開(kāi)模式選擇二進(jìn)制讀取"rb"。
f = open(filename, "rb")
第二步,需要打開(kāi)按照行列讀取文件,由于是純二進(jìn)制文件,內(nèi)部不含郵任何的數(shù)據(jù)結(jié)構(gòu)信息,因此我們需要給定二進(jìn)制數(shù)據(jù)的行數(shù)列數(shù)(nx和ny)來(lái)確定圖像的形狀。這里我們的數(shù)據(jù)類型是float32型的,對(duì)應(yīng)過(guò)來(lái)是4bytes,使用for循環(huán)逐個(gè)read4個(gè)字節(jié)。
for i in range(nx): for j in range(ny): data = f.read(4)
得到的結(jié)果如下:
b'5\x9d\x82\xc3' b'\xb1\x04\x10\xc4' b'\xc1\x9eD\xc4' b'a\x86R\xc4' b'\x15\x01=\xc4'
可以看到,讀入的數(shù)據(jù)為十六進(jìn)制數(shù),這個(gè)時(shí)候的數(shù)據(jù)并不能直接用來(lái)畫(huà)圖,需要轉(zhuǎn)換為float32型。這里使用struct.unpack來(lái)轉(zhuǎn)譯
data_float = struct.unpack("f", data)[0]
就可以得到正確的結(jié)果了
-261.2281799316406 -576.0733032226562 -786.4805297851562 -842.0996704101562 -756.0169067382812
建立一個(gè)numpy數(shù)組,將讀入的數(shù)據(jù)分別按列優(yōu)先的方式放入數(shù)組,就完成了圖像讀入的操作。
將上述操作包裝成函數(shù),代碼如下:
def xshow(filename, nx, nz): f = open(filename, "rb") pic = np.zeros((nx, nz)) for i in range(nx): for j in range(nz): data = f.read(4) elem = struct.unpack("f", data)[0] pic[i][j] = elem f.close() return pic
2. 畫(huà)出圖像
這里我們的目的是將矩陣輸出灰度圖,并保存為tiff格式的圖像,效果圖如下(該圖為使用彈性波波動(dòng)方程在Marmousi模型下的波場(chǎng)快照):
不需要坐標(biāo)軸的信息,直接使用imsave命令,使用cmap選定顏色格式即可。
plt.imsave('output.tiff', img, format='tiff', cmap=plt.cm.gray)
如果使用PIL庫(kù)讀取圖像,可能會(huì)得到不同的效果,可能需要做直方圖均衡,目前還沒(méi)有找到原因。
以上這篇使用Python讀取二進(jìn)制文件的實(shí)例講解就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
使用python實(shí)現(xiàn)遞歸版漢諾塔示例(漢諾塔遞歸算法)
這篇文章主要介紹了使用python實(shí)現(xiàn)遞歸版漢諾塔示例(漢諾塔遞歸算法),需要的朋友可以參考下2014-04-04Pycharm無(wú)法打開(kāi)雙擊沒(méi)反應(yīng)的問(wèn)題及解決方案
這篇文章主要介紹了Pycharm無(wú)法打開(kāi),雙擊沒(méi)反應(yīng),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08python如何讀取和存儲(chǔ)dict()與.json格式文件
這篇文章主要介紹了python如何讀取和存儲(chǔ)dict()與.json格式文件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。2022-06-06Python還能這么玩之只用30行代碼從excel提取個(gè)人值班表
公司實(shí)行項(xiàng)目值班制度,拿到值班表,看到全部的值班信息,要去查找自己的值班信息,是一件頭痛的事情.作為程序員,當(dāng)然要簡(jiǎn)化,將自己的信息提煉出來(lái),需要的朋友可以參考下2021-06-06