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

6

我有一张来自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个字节,将它们转换为位(bit),然后将它们解包成两个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))

听起来像是图像交错了,如果将四个象限合并成一个,它看起来是否正确?参见https://en.wikipedia.org/wiki/Interlacing_(bitmaps)。 - Dana the Sane
不,它不是交错的。如果是的话,至少在水平方向上看起来还可以,但这在两个方向上都是错误的。 - Ivan
1个回答

6

使用这段代码

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)

谢谢,就是这样。我一开始写对了,后来在测试时改了一下,忘记改回来了。 - Ivan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接