You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将1D 16bit FPD图像数据转换为3072×3072 8bit 2D numpy数组

解决方案

你当前的数组生成方式存在两个错误:

  • 原始字节总长度为18874568,而3072×3072的16bit图像有效像素总字节数为3072*3072*2=18874368,多出来的200字节是文件头,必须跳过,对应C#参考代码中的offset参数。
  • 把字节逐个转为uint16元素的逻辑完全错误:每个16bit像素由2个字节组成,这种写法会把每个字节单独作为一个数组元素,直接破坏像素结构,最终得到的数组长度是预期像素数的2倍左右。

从C#参考代码可以确认,该FPD输出的16bit像素为小端序存储:每个像素的低8位存在低地址字节,高8位存在高地址字节,组合逻辑为像素值 = 高8位 << 8 | 低8位。


正确处理代码

1. 解析得到3072×3072的16bit 2D数组

不要用list(data)做转换,直接调用numpy的字节解析接口,效率更高且不会出错:

import numpy as np

# 假设data是你读取到的原始字节数据
offset = 200
valid_bytes = data[offset:]

# 按小端无符号16位格式解析字节,<u2 代表小端、2字节无符号整数
img16_flat = np.frombuffer(valid_bytes, dtype="<u2")
# 校验解析长度是否正确
assert img16_flat.size == 3072 * 3072, f"像素数不匹配,当前解析得到{img16_flat.size}个像素"
# 重构为2D数组
img16_2d = img16_flat.reshape((3072, 3072))

2. 转换为8bit 2D数组

根据使用场景二选一即可:

  • 取高8位(推荐,和C#代码显示逻辑对齐,速度最快):绝大多数FPD输出为12/14位有效位,有效信息集中在高位,直接右移取高8位不会丢失核心信息:
img8_2d = (img16_2d >> 8).astype(np.uint8)
  • Min-Max线性拉伸:如果图像整体偏暗/对比度低,可以用这个方式把像素值自动拉伸到0-255全范围:
pix_min = img16_2d.min()
pix_max = img16_2d.max()
img8_2d = ((img16_2d - pix_min) / (pix_max - pix_min) * 255).astype(np.uint8)

如果需要生成和C#代码输出一致的三通道RGB图像,将单通道灰度值复制到三个通道即可:

img8_rgb = np.repeat(img8_2d[..., np.newaxis], 3, axis=2)

内容的提问来源于stack exchange,提问作者Arki99

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 23:27:35