image - 如何将 numpy 数组编写为高动态范围图像?
问题描述
我在 Python 中做一些图像反卷积,反卷积图像是在具有 3 个轴的 numpy 数组中生成的:x
和y
RGB。所以一个典型的数组的形状是3000 x 3000 x 3
。
我希望将结果输出为某种图像文件。PNG、TIFF、JPEG 或任何其他广泛使用的格式都可以。
我的问题是,imageio.imsave
所有函数都以每个颜色平面的 8 位精度写入文件。我需要更多的动态范围。有一个“实验”位参数imageio.imsave
,但它似乎对 RGB 图像没有影响。
有没有办法将 numpy 数组输出为每个颜色平面精度为 16 位或 32 位的 RGB 图像?
解决方案
您可以使用OpenCV,它已经将 NumPy 数组用于图像。为了保存,有以下imwrite
功能:
通常,使用此功能只能保存 8 位单通道或 3 通道(具有“BGR”通道顺序)图像,但以下情况除外:
- 在 PNG、JPEG 2000 和 TIFF 格式的情况下,可以保存 16 位无符号 (CV_16U) 图像
- 32 位浮点 (CV_32F) 图像可以保存为 PFM、TIFF、OpenEXR 和 Radiance HDR 格式;3 通道 (CV_32FC3) TIFF 图像将使用 LogLuv 高动态范围编码(每像素 4 字节)保存
我做了以下小测试:
import cv2
import numpy as np
image_8 = np.uint8(np.random.rand(300, 300, 3) * 255)
image_16 = np.uint16(np.random.rand(300, 300, 3) * 65535)
image_32 = np.float32(np.random.rand(300, 300, 3))
cv2.imwrite('image_8.png', image_8)
cv2.imwrite('image_16.png', image_16)
cv2.imwrite('image_32.exr', image_32)
我可以使用 GIMP 打开所有图像,并且位深度都设置正确。我无法编写和打开(使用 GIMP)一个 32 位浮点 TIFF,我无法解释为什么会这样。有几个ImwriteFlags
,但似乎没有一个解决使用 32 位浮点数保存 TIFF 的问题。尽管如此,32 位浮点 EXR 仍然有效。
希望有帮助!
推荐阅读
- xamarin - Appcenter 分发在 Xamarin.iOS 中不起作用的应用内更新
- performance - 为什么在继续使用 jdbc 插入一行后在 oracle11g 中它变得很慢
- reactjs - React JS 中循环内的条件渲染
- azure-devops - 查询以根据过滤条件仅显示相关工作项
- node.js - 为什么 async/await exec 不输出标准输出
- amazon-web-services - Aws Lambda 显示进度
- vue.js - 如何在 v-for 循环中绑定 vue js 模板中的 css 类?
- javascript - Eloquent JS 中的逻辑运算符示例说明
- performance - unity 2d,多层背景透支
- java - 如何使用流获取嵌套集合中的所有元素