Python:读取12位打包的二进制图像

Iva*_*van 6 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))
Run Code Online (Sandbox Code Playgroud)

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

然而,结果与它应该是非常不同的.看起来图像被分成四个四分之一,每个四分之一扩展到完整图像大小然后重叠.

我在这做错了什么?

更新:以下是测试文件:

12位打包

12位正常

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

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

b = numpy.reshape(a,(484,644))
Run Code Online (Sandbox Code Playgroud)

cop*_*roc 5

有了这个代码

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

您正在读取字节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)
Run Code Online (Sandbox Code Playgroud)

[EDIT] 更加紧凑的是:

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