使用Python讀取二進位制檔案
阿新 • • 發佈:2019-01-03
目標:目標檔案為一個float32型儲存的二進位制檔案,按列優先方式儲存。本文使用Python讀取該二進位制檔案並使用matplotlib.pyplot相關工具畫出影象
工具:Python3, matplotlib,os,struct,numpy
1. 讀取二進位制檔案
首先使用open函式開啟檔案,開啟模式選擇二進位制讀取"rb"。
f = open(filename, "rb")
第二步,需要開啟按照行列讀取檔案,由於是純二進位制檔案,內部不含郵任何的資料結構資訊,因此我們需要給定二進位制資料的行數列數(nx和ny)來確定影象的形狀。這裡我們的資料型別是float32型的,對應過來是4bytes,使用for迴圈逐個read4個位元組。
for i in range(nx):
for j in range(ny):
data = f.read(4)
得到的結果如下:
b'5\x9d\x82\xc3'
b'\xb1\x04\x10\xc4'
b'\xc1\x9eD\xc4'
b'a\x86R\xc4'
b'\x15\x01=\xc4'
可以看到,讀入的資料為十六進位制數,這個時候的資料並不能直接用來畫圖,需要轉換為float32型。這裡使用struct.unpack來轉譯
data_float = struct.unpack("f", data)[0]
就可以得到正確的結果了
-261.2281799316406
-576.0733032226562
-786.4805297851562
-842.0996704101562
-756.0169067382812
建立一個numpy陣列,將讀入的資料分別按列優先的方式放入陣列,就完成了影象讀入的操作。
將上述操作包裝成函式,程式碼如下:
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. 畫出影象
這裡我們的目的是將矩陣輸出灰度圖,並儲存為tiff格式的影象,效果圖如下(該圖為使用彈性波波動方程在Marmousi模型下的波場快照):
不需要座標軸的資訊,直接使用imsave命令,使用cmap選定顏色格式即可。
plt.imsave('output.tiff', img, format='tiff', cmap=plt.cm.gray)
如果使用PIL庫讀取影象,可能會得到不同的效果,可能需要做直方圖均衡,目前還沒有找到原因。