Python: reading 12 bit packed binary image

妖精的绣舞 提交于 2019-12-21 16:23:40

问题


I have a 12 bit packed image from a GigE camera. It is a little-endian file and each 3 bytes hold 2 12-bit pixels. I am trying to read this image using python and I tried something like this:

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

In short: I read 3 bytes, convert them to bits and then unpack them as two 12-bit integers.

The result is, however, very different from what it should be. It looks like the image is separated into four quarters, each of them expanded to full image size and then overlapped.

What am I doing wrong here?

Update: Here are the test files:

12-bit packed

12-bit normal

They will not be identical, but they should show the same image. 12-bit normal has 12-bit pixel as uint16.

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

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

回答1:


With this code

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

you are reading bytes data[0:3], data[1:4], ... What you actually want is probably this:

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

[EDIT] Even more compact would be this:

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


来源:https://stackoverflow.com/questions/37797779/python-reading-12-bit-packed-binary-image

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!