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

cv2.imwrite保存uint16类型numpy数组读取后变为uint8问题求解

问题解决:OpenCV保存uint16格式TIFF后读取变为uint8的处理方案

根本原因

cv2.imread默认使用cv2.IMREAD_COLOR标志读取图像,该模式会强制将所有图像转换为8位uint8格式,和你存储的文件本身的位深无关,你之前的保存逻辑本身没有问题,问题出在读取环节。

解决方法

读取图像时传入保留原始位深的标志即可:

  • cv2.IMREAD_UNCHANGED:同时保留图像原始通道数和原始位深,通用场景优先用这个
  • cv2.IMREAD_ANYDEPTH:仅保留原始位深,适合不需要保留通道数的场景

修改后的代码示例

import cv2
import numpy as np

pixel_array = ds.pixel_array
print(pixel_array.dtype)
# 保存逻辑无需调整,只要数组是uint16格式即可正常存储为16位TIFF
cv2.imwrite('result.TIFF', pixel_array.astype(np.uint16))
# 读取时添加标志保留位深
im = cv2.imread('result.TIFF', cv2.IMREAD_UNCHANGED)
print(im.dtype) # 此时输出为uint16

注意事项

  • 不要使用cv2.IMREAD_GRAYSCALE、cv2.IMREAD_COLOR这类默认强制转8位的参数读取16位图像
  • 存储前确认数组数值范围在uint16的合法区间0~65535内,避免数值溢出导致存储结果异常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 14:27:03