我有一个来自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位像素作为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) 我有一个包含10位整数流的二进制文件.我想读它并将值存储在列表中.
它使用以下代码,它读取my_file并填充pixels整数值:
file = open("my_file", "rb")
pixels = []
new10bitsByte = ""
try:
byte = file.read(1)
while byte:
bits = bin(ord(byte))[2:].rjust(8, '0')
for bit in reversed(bits):
new10bitsByte += bit
if len(new10bitsByte) == 10:
pixels.append(int(new10bitsByte[::-1], 2))
new10bitsByte = ""
byte = file.read(1)
finally:
file.close()
Run Code Online (Sandbox Code Playgroud)
将字节读入位并将其读回"10位"字节似乎并不优雅.有没有更好的方法呢?
使用8位或16位整数,我可以直接使用file.read(size)并将结果转换为int.但是在这里,因为每个值都存储在1.25字节,我需要像file.read(1.25)...
numpy我正在尝试对整数(特别是对象)进行位移numpy.uint64,并且我需要它们很快。在下面的实现中,我将对象放入numpy.arrayonly 中,因为这是唯一可以接受位左移的对象。如果有更快的实施,我会接受。
from timeit import timeit
print(timeit("a << 1", "a = int(2**60)"))
print(timeit("a << 1", "import numpy as np; a = np.array([2 ** 60], dtype=np.uint64)"))
print(timeit("np.left_shift(a, 1)", "import numpy as np; a = np.array([2 ** 60], dtype=np.uint64)"))
Run Code Online (Sandbox Code Playgroud)
返回:
0.056681648000000084
1.208092987
1.1685176299999998
Run Code Online (Sandbox Code Playgroud)
为什么 python 比这个操作快得多numpy?有没有办法获得可比较的速度numpy?