微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python:读取12位二进制文​​件

如何解决Python:读取12位二进制文​​件

我的实现与@ max9111提出的实现略有不同,该实现不需要调用unpackbits

它通过将中间字节切成两半并使用numpy的二进制运算,直接uint12从三个连续的值中创建两个值uint8。在下文中,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_uint1214 ms±513 µs循环(平均±标准偏差,共运行7次,每个循环100次)

解决方法

我正在尝试使用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帧的640x256视频大约需要1毫秒。

据我所知,当文件以12位编码时,由于没有uint12类型,因此无法使用它。所以我想做的是读取一个12位的文件并将其存储在16位的uint数组中。以下内容摘自(Python:读取12位压缩二进制图像),其工作原理是:

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))

但是,这非常慢:用我的机器读取640x256的视频只有5帧需要大约11.5
s。理想情况下,我希望能够像使用memmap读取8位或16位文件一样高效地读取12位文件。或至少不慢10 ^ 5倍。我怎样才能加快速度?

这是一个文件示例:
http
://s000.tinyupload.com/index.php?file_id=26973488795334213426(nb_frames=5,高度=
256,宽度= 640)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。