1. 程式人生 > >使用Python讀取二進位制檔案

使用Python讀取二進位制檔案

    目標:目標檔案為一個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庫讀取影象,可能會得到不同的效果,可能需要做直方圖均衡,目前還沒有找到原因。