Python:读取 12 位压缩二进制图像

标签 python binary unpack

我有一个来自 GigE 相机的 12 位压缩图像。它是一个小端文件,每 3 个字节包含 2 个 12 位像素。 我正在尝试使用 python 读取这张图片,我尝试了这样的操作:

import bitstring
import numpy

with open('12bitpacked1.bin', 'rb') as f:
    data = f.read()
ii=numpy.zeros(2*len(data)/3)
ic = 0

for oo in range(0,len(data)/3):
    aa = bitstring.Bits(bytes=data[oo:oo+3], length=24)
    ii[ic],ii[ic+1] = aa.unpack('uint:12,uint:12')
    ic=ic+2

b = numpy.reshape(ii,(484,644))

简而言之:我读取 3 个字节,将它们转换为位,然后将它们解包为两个 12 位整数。

然而,结果与应有的结果大不相同。看起来图像被分成四个部分,每个部分都扩展到完整图像大小,然后重叠。

我在这里做错了什么?

更新:以下是测试文件:

12-bit packed

12-bit normal

它们不会完全相同,但它们应该显示相同的图像。 12 位法线具有 12 位像素作为 uint16。

with open('12bit1.bin', 'rb') as f:
    a = numpy.fromfile(f, dtype=numpy.uint16)

b = numpy.reshape(a,(484,644))

最佳答案

用这段代码

for oo in range(0,len(data)/3):
  aa = bitstring.Bits(bytes=data[oo:oo+3], length=24)

你正在读取字节 data[0:3], data[1:4], ...你真正想要的可能是这样的:

for oo in range(0,len(data)/3):
  aa = bitstring.Bits(bytes=data[3*oo:3*oo+3], length=24)

[编辑] 更紧凑的是:

for oo in range(0,len(data)-2,3):
  aa = bitstring.Bits(bytes=data[oo:oo+3], length=24)

关于Python:读取 12 位压缩二进制图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37797779/

相关文章:

c++ - 数字的二进制表示的大小

ruby - 使用 bundler ,如何解压缩通过 git 存储库安装的 gem?

perl - 将十六进制字符串转换为二进制

python - 将具有 x 列的数据帧插入 <x 列

python - 是否有一个库可以检测代码块的源代码语言?

python - Django @staticmethod 两个字段之和

Perl 密码学 : Encrypting/Decrypting ASCII chracters with pack and unpack functions

python - python 的所有内置函数都有神奇的方法吗?

Java 十进制转二进制 - 大数转二进制

java - 将字符串转换为二进制 [Java]