当前位置: 首页 > 面试题库 >

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

魏誉
2023-03-14
问题内容

我正在尝试使用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,height,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)。


问题答案:

我的实现与@ 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])

我以其他实现作为基准,这种html" target="_blank">方法在〜5 Mb输入下被证明快了约4倍:
read_uint12_unpackbits每个循环65.5 ms±1.11 ms(平均±标准偏差,运行7次,每个循环10个循环),每个
read_uint1214 ms±513 µs循环(平均±标准偏差,共运行7次,每个循环100次)



 类似资料:
  • 问题内容: 我发现用Python读取二进制文件特别困难。你能帮我个忙吗?我需要读取此文件,在Fortran 90中,该文件很容易被读取 详细而言,文件格式为: 如何使用Python阅读?我尝试了一切,但没有成功。我是否有可能在python中使用f90程序,读取此二进制文件,然后保存需要使用的数据? 问题答案: 读取二进制文件内容,如下所示: 然后使用struct.unpack “解压缩”二进制数据

  • 问题内容: 我有一个较长的无符号整数文件(每个64位,0.47GB文件),需要读取并存储在数组中。经过一番思考之后,由于Java中的所有内容都已签名(请纠正我,请纠正我),因此我长时间使用了该类型,我想不出更好的选择了。无论如何,仅需对数组进行排序,因此原始数字的精确值并不是最重要的。我们应该测量排序算法的效率,仅此而已。但是,当我实际要读取文件时(在下面的代码中),我遇到了砖墙。 它会一直持续下

  • 问题内容: 我正在尝试从URLConnection读取二进制文件。当我使用文本文件对其进行测试时,它似乎可以正常工作,但对于二进制文件则不能。发送文件时,我在服务器上使用以下mime类型: 但是到目前为止,似乎没有任何效果。这是我用来接收文件的代码: 问题答案: 我就是这样

  • 问题内容: 我正在尝试在Python中读取BMP文件。我知道前两个字节表示BMP公司。接下来的4个字节是文件大小。当我执行时: 我得到: ValueError:以10为底的int()的无效文字:’F#\ x13’ 我想做的是将这四个字节读取为整数,但是Python似乎将它们读取为字符并返回一个字符串,该字符串无法转换为整数。如何正确执行此操作? 问题答案: 该方法将字节序列作为字符串返回。要将字符

  • 所以。。。我需要从.pkl文件中读取并导入图像数据集。图像存储为“二进制blob”。一旦完成了,我需要将它们转换成字节格式,这样我就可以通过Google的CloudVision运行它们。我设法在Linux虚拟机上打开了该文件(花了几天时间试图让它在Windows上工作…)。但现在我似乎无法将这个“二进制斑点”转换为我可以使用的实际图像。。。 下面是一个“二进制blob”: \1\x0 0 0 0\

  • 问题内容: 在Python中,如何读取二进制文件并在该文件的每个字节上循环? 问题答案: Python 2.4及更早版本 Python 2.5-2.7 请注意,with语句在2.5以下的Python版本中不可用。要在v 2.5中使用它,你需要导入它: 在2.6中是不需要的。 Python 3 在Python 3中,这有点不同。我们将不再以字节模式而是字节对象从流中获取原始字符,因此我们需要更改条件