提问者:小点点

Numpy将uint16解包到1-5-5-5位块


我试图使用numpy在Python中将二进制字符串转换为图像,但我很难找到一种使用非常规位分布的好方法(就我的知识而言)。

这些是如何转换和转换什么的细节。 16位纹理块(256*256)。 每个bitu16表示其颜色为ARGB,MSB至LSB形式的像素:1位透明
5位红色通道5位绿色通道5位蓝色通道

Numpy实际上并不支持任何1位或5位的东西。 我尝试用不同的argb通道设置一个np.dtype,但没有成功。 unpackbits似乎不能在uint16上工作,因此在这种情况下,我可能不得不将其拆分为2个Uint8


dt = np.dtype([('a', np.bool_), ('r', np.half), ('g', np.half), ('b', np.half)])

data = data.read(131072)

dataFromBuffer = np.frombuffer(data, dtype=dt)
img  = dataFromBuffer.reshape(256, 256)



共1个答案

匿名用户

在这种情况下,您是正确的,因为您没有bit numpy bit级别的支持。 处理BIT的高级(但实用)方法可如下所示:

image_16_bit = 123 # A 16bit integer.

bits = '{:016b}'.format(image_16_bit) 

transparency = int(bits[0], 2)
red_channel = int(bits[1:6], 2)
green_channel = int(bits[6:11], 2)
blue_channel = int(bits[11:], 2)

print(transparency, red_channel, green_channel, blue_channel) # 0 0 3 27

您可以在所有int上运行这个,然后收集正确的值。 最后,您可以将其强制转换为一个numpy数组,以获得作为numpy数组的图像。