python - 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)
解决方案
在这种情况下,您对缺乏位 numpy 位级别的支持是正确的。处理位的高级(但功能性)方法可以如下完成:
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
您可以在所有整数上运行它,然后收集各个通道值。最后,您可以将其转换为一个 numpy 数组,以将您的图像作为一个 numpy 数组。
推荐阅读
- java - 如何获取二维数组的行总和并将它们从高到低排列?
- angular - 从 Springboot rest api 重定向到一个角度页面 url
- angular - Angular 库的间歇性 NPM 构建错误 - ENOENT:没有这样的文件或目录,chmod 'dist/acme/library/bundles/acme-library.umd.min.js.map'
- javascript - Leetcode EASY 最长公共前缀解释
- javascript - 无法在 ID 中设置为未定义的值
- android - 安卓
不适用于 ViewBinding - r - 重新调整数据以匹配特定峰值?
- css - SCSS - 从键 2 开始循环列表
- python - 在python中启动函数之前的初始值numpy数组
- r - 如何计算贝叶斯混合效应模型中参数水平之间的对比并在 R 中产生贝叶斯因子?