2017-06-24 74 views
0

我試圖讀取包含圖像使用Python 3的Python:讀取12位二進制文​​件

要讀取類似文件,但在16位編碼(視頻)12位二進制文​​件,下面的作品非常良好:

import numpy as np 
images = np.memmap(filename_video, dtype=np.uint16, mode='r', shape=(nb_frames, height, width)) 

其中filename_video是文件和nb_frames,高度和視頻的寬度的特點,可以從另一個文件中讀取。通過「工作得很好」我的意思是快速:在我的計算機上閱讀具有140幀的640x256視頻需要大約1 ms。

據我所知,當文件編碼爲12位時,由於沒有uint12類型,我不能使用它。所以我試圖做的是讀取一個12位文件並將其存儲在一個16位uint數組中。下面,從(Python: reading 12 bit packed binary image)採取工程:

with open(filename_video, 'rb') as f: 
    data=f.read() 
images=np.zeros(int(2*len(data)/3),dtype=np.uint16) 
ii=0 
for jj in range(0,int(len(data))-2,3): 
    a=bitstring.Bits(bytes=data[jj:jj+3],length=24) 
    images[ii],images[ii+1] = a.unpack('uint:12,uint:12') 
    ii=ii+2 
images = np.reshape(images,(nb_frames,height,width)) 

然而,這是很慢:讀取640x256的視頻臨屋區只有5幀需要大約11.5住在我的機器。理想情況下,我希望能夠有效地讀取12位文件,因爲我可以使用memmap讀取8位或16位文件。或者至少不會慢10^5倍。我怎麼能加快速度?

這是一個文件示例: http://s000.tinyupload.com/index.php?file_id=26973488795334213426 (nb_frames = 5,height = 256,width = 640)。

回答

1

當我讀到這個問題時,我認爲必須有一個簡單的答案,但我失敗了。不過,我寫了一個比你的例子快300倍的簡單(但很難看)的代碼,在我的筆記本電腦上(Core iM)達到了25 MB/s左右。

def read_uint12(filename_video,nb_frames,height,width): 

    data=np.fromfile(filename_video, dtype=np.uint8) 
    data=np.unpackbits(data) 
    data=data.reshape((data.shape[0]/12,12)) 

    images=np.zeros(data_2.shape[0],dtype=np.uint16) 
    for i in xrange(0,12): 
     images+=2**i*data[:,11-i] 

    images = np.reshape(images,(nb_frames,height,width)) 
    return images 

如果你需要更快的代碼,我認爲這必須在C中完成,並用cython包裝。