Python:读取12位二进制文??件
我试图使用
Python 3读取包含图像(视频)的12位二进制文??件.
要读取类似的文件但以16位编码,以下内容非常有效: import numpy as np images = np.memmap(filename_video,dtype=np.uint16,mode='r',shape=(nb_frames,height,width)) 其中filename_video是可以从另一个文件读取的视频的文件和nb_frames,高度和宽度特征.通过“工作得很好”我的意思是快速:在我的计算机上读取140帧的640×256视频大约需要1毫秒. 据我所知,当文件以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,width)) 然而,这非常慢:阅读640×256视频只有5帧,我的机器需要大约11.5秒.理想情况下,我希望能够像使用memmap读取8位或16位文件一样有效地读取12位文件.或者至少慢10 ^ 5倍.我怎么能加快速度呢? 这是一个文件示例: 解决方法
我与@ max9111提出的实现略有不同,不需要调用unpackbits.
它通过将中间字节切成两半并使用numpy的二进制操作直接从三个连续的uint8创建两个uint12值.在下文中,假设data_chunks是包含任意数量的12位整数的信息的二进制字符串(因此其长度必须是3的倍数). def read_uint12(data_chunk): data = np.frombuffer(data_chunk,dtype=np.uint8) fst_uint8,mid_uint8,lst_uint8 = np.reshape(data,(data.shape[0] // 3,3)).astype(np.uint16).T fst_uint12 = (fst_uint8 << 4) + (mid_uint8 >> 4) snd_uint12 = ((mid_uint8 % 16) << 8) + lst_uint8 return np.reshape(np.concatenate((fst_uint12[:,None],snd_uint12[:,None]),axis=1),2 * fst_uint12.shape[0]) 我使用其他实现进行基准测试,这种方法在~5 Mb输入上的速度提高了约4倍:read_uint12_unpackbits每循环65.5 ms±1.11 ms(平均值±标准偏差,7次运行,每次10次循环)read_uint12每循环14 ms±513μs(7次运行的平均值±标准偏差,每次100次循环) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |