如何将numpy数组写入高动态范围图像



我正在Python中进行一些图像去卷积,去卷积后的图像在一个有3个轴的numpy数组中生成:xy和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仍然有效。

希望能有所帮助!

相关内容

  • 没有找到相关文章

最新更新