首页 > 解决方案 > 如何将 numpy 数组编写为高动态范围图像?

问题描述

我在 Python 中做一些图像反卷积,反卷积图像是在具有 3 个轴的 numpy 数组中生成的:xyRGB。所以一个典型的数组的形状是3000 x 3000 x 3

我希望将结果输出为某种图像文件。PNG、TIFF、JPEG 或任何其他广泛使用的格式都可以。

我的问题是,imageio.imsave所有函数都以每个颜色平面的 8 位精度写入文件。我需要更多的动态范围。有一个“实验”位参数imageio.imsave,但它似乎对 RGB 图像没有影响。

有没有办法将 numpy 数组输出为每个颜色平面精度为 16 位或 32 位的 RGB 图像?

标签: imagenumpyimage-processing

解决方案


您可以使用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 仍然有效。

希望有帮助!


推荐阅读