Python: Lesen von 12-Bit-Binärbildern

Ich habe ein 12-Bit-Bild von einer GigE-Kamera gepackt. Es ist eine Little-Endian-Datei und jedes 3 Byte enthält 2 12-Bit-Pixel. Ich versuche, dieses Bild mit Python zu lesen, und habe Folgendes versucht:

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

urz gesagt: Ich lese 3 Bytes, konvertiere sie in Bits und entpacke sie dann als zwei 12-Bit-Ganzzahle

Das Ergebnis unterscheidet sich jedoch stark von dem, was es sein sollte. Es sieht so aus, als ob das Bild in vier Viertel aufgeteilt ist, von denen jedes auf die volle Bildgröße vergrößert und dann überlappt wird.

Was mache ich hier falsch?

Aktualisieren Hier sind die Testdateien:

12-Bit gepackt

12-bit normal

Sie werden nicht identisch sein, aber sie sollten das gleiche Bild zeigen. 12-Bit-Normal hat 12-Bit-Pixel als uint16.

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

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

Antworten auf die Frage(2)

Ihre Antwort auf die Frage