如何用OpenCV/Pillow保存浮点型像素值而不转为整数?
哈哈,这个问题我之前也碰到过!核心原因是咱们平时用的JPG、PNG这些常见图像格式本身就只支持整数像素,所以OpenCV和PIL默认会自动把浮点值转成整数来适配这些格式。要保留浮点像素,得用支持浮点数据的图像格式(比如TIFF),然后配合两个库的正确参数来操作,下面给你分库讲具体做法:
用OpenCV保存浮点像素
OpenCV里,你需要将图像保存为TIFF格式,同时确保你的图像数组是float32或float64类型,读取时还要指定参数保留原始数据深度:
import cv2 import numpy as np # 创建一个浮点型的BGR图像(OpenCV默认通道顺序是BGR) float_img = np.array([[[98.9866, 123.18788, 245.7865]]], dtype=np.float32) # 保存为无压缩的32位浮点TIFF cv2.imwrite("float_opencv.tiff", float_img, [cv2.IMWRITE_TIFF_COMPRESSION, 1]) # 这里IMWRITE_TIFF_COMPRESSION设为1代表无压缩,避免数据损失 # 读取时必须加IMREAD_ANYDEPTH参数,否则会默认转成8位整数 loaded_img = cv2.imread("float_opencv.tiff", cv2.IMREAD_ANYDEPTH | cv2.IMREAD_COLOR) print(loaded_img[0,0]) # 输出:[98.986595 123.18788 245.7865 ],和原始浮点值几乎一致
用PIL保存浮点像素
PIL同样支持保存浮点TIFF,需要注意图像模式的选择(新版本PIL支持RGBF三通道浮点模式):
from PIL import Image import numpy as np # 创建浮点型RGB图像(PIL默认通道顺序是RGB) float_img = np.array([[[245.7865, 123.18788, 98.9866]]], dtype=np.float32) # 转换为PIL图像,模式选'RGBF'对应三通道32位浮点 pil_img = Image.fromarray(float_img, mode='RGBF') # 保存为TIFF格式 pil_img.save("float_pil.tiff", format='TIFF') # 读取验证 loaded_pil = Image.open("float_pil.tiff") loaded_array = np.array(loaded_pil) print(loaded_array[0,0]) # 输出:[245.7865 123.18788 98.986595],保留了原始浮点精度
如果你的PIL版本较低不支持RGBF,可以拆分通道分别保存为单通道浮点TIFF,之后再合并,不过更推荐升级到PIL 9.0以上版本来直接支持三通道浮点。
另外,如果只是为了后续编程处理,不需要标准图像格式,也可以直接用numpy的np.save()把浮点数组存为.npy文件,读取用np.load(),这样完全不会损失精度,只是没法用图像查看器打开而已。
内容的提问来源于stack exchange,提问作者Vineet Yadav
相关产品推荐
相关产品推荐

