【问题标题】:Python: reading 12 bit packed binary imagePython:读取 12 位打包二进制图像
【发布时间】:2016-10-14 08:18:01
【问题描述】:

我有一张来自 GigE 相机的 12 位打包图像。它是一个 little-endian 文件,每 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))

【问题讨论】:

  • 听起来图像是交错的,如果将4个象限合并为1个象限是否正确?见en.wikipedia.org/wiki/Interlacing_(bitmaps)
  • 不,它不是隔行扫描的。如果是这样的话,至少在水平方向上看起来不错,但这在两个方向上都是错误的。

标签: python binary unpack


【解决方案1】:

使用此代码

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)

【讨论】:

  • 谢谢,就是这样。我先把它弄对了,然后在测试一些东西,然后把它改成了这个,忘记放回去了。
猜你喜欢
  • 2017-11-27
  • 2013-07-02
  • 2010-09-13
  • 2011-12-09
  • 1970-01-01
  • 2013-12-22
  • 1970-01-01
  • 2011-12-04
  • 1970-01-01
相关资源
最近更新 更多