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

我正在用Python做一些图像反卷积,并且反卷积的图像是在具有3个轴的numpy数组中生成的:xy和RGB。因此,典型数组的形状为3000 x 3000 x 3

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

我的问题是,诸如imageio.imsave之类的功能全部在每个彩色平面上仅以8位精度写入文件。我需要更多动态范围。 imageio.imsave有一个“实验”位参数,但似乎对RGB图像没有影响。

是否有一种方法可以将numpy数组输出为每个色彩平面具有16或32位精度的RGB图像?

mfpaaa 回答:如何将numpy数组写为高动态范围图像?

您可以使用OpenCV,该图像已经使用NumPy数组。为了保存,有imwrite函数:

  

通常,使用此功能只能保存8位单通道或3通道(具有“ BGR”通道顺序)图像,但以下情况除外:

     
      
  • 对于PNG,JPEG 2000和TIFF格式,可以保存16位无符号(CV_16U)图像
  •   可以以PFM,TIFF,OpenEXR和Radiance HDR格式保存
  • 32位浮点(CV_32F)图像;使用LogLuv高动态范围编码(每像素4个字节)保存3通道(CV_32FC3)TIFF图像
  •   

我做了以下小测试:

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,3) * 65535)
image_32 = np.float32(np.random.rand(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仍然有效。

希望有帮助!

本文链接:https://www.f2er.com/3097808.html

大家都在问