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

Python:读取12位二进制文​​件,第1张

概述我试图使用 Python 3读取包含图像(视频)的12位二进制文​​件. 要读取类似的文件但以16位编码,以下内容非常有效: import numpy as npimages = np.memmap(filename_video, dtype=np.uint16, mode='r', shape=(nb_frames, height, width)) 其中filename_video是可以从另一 我试图使用 Python 3读取包含图像(视频)的12位二进制文​​件.

要读取类似的文件但以16位编码,以下内容非常有效:

import numpy as npimages = 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=0for 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+2images = np.reshape(images,(nb_frames,wIDth))

然而,这非常慢:阅读640×256视频只有5帧,我的机器需要大约11.5秒.理想情况下,我希望能够像使用memmap读取8位或16位文件一样有效地读取12位文件.或者至少慢10 ^ 5倍.我怎么能加快速度呢?

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

解决方法 我与@ 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次循环)

总结

以上是内存溢出为你收集整理的Python:读取12位二进制文​​件全部内容,希望文章能够帮你解决Python:读取12位二进制文​​件所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1194384.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存