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
相关产品推荐
相关产品推荐

