如何在Python中快速读取RGBE格式的hdr图像?
How to read a hdr image quickly in the RGBE format in Python?
我想知道如何在 Python.
中快速有效地获取 RGBE 格式的像素值来读取 HDR 图像 (.hdr)
这些是我尝试过的:
import imageio
img = imageio.imread(hdr_path, format="HDR-FI")
或者:
import cv2
img = cv2.imread(hdr_path, flags=cv2.IMREAD_ANYDEPTH)
这会读取图像,但会以 RGB 格式给出值。
如何在不改变 RGB 值的情况下获得第 4r 个通道,即每个像素的“E”通道?
我更喜欢只涉及 imageio 的解决方案,因为我只能使用该模块。
如果您更喜欢 RGBE 表示而不是浮点表示,您可以在两者之间进行转换
def float_to_rgbe(image, *, channel_axis=-1):
# ensure channel-last
image = np.moveaxis(image, channel_axis, -1)
max_float = np.max(image, axis=-1)
scale, exponent = np.frexp(max_float)
scale *= 256.0/max_float
image_rgbe = np.empty((*image.shape[:-1], 4)
image_rgbe[..., :3] = image * scale
image_rgbe[..., -1] = exponent + 128
image_rgbe[scale < 1e-32, :] = 0
# restore original axis order
image_rgbe = np.moveaxis(image_rgbe, -1, channel_axis)
return image_rgbe
(注意:这是基于RGBE参考实现(found here),如果确实是瓶颈,可以进一步优化。)
在你的评论中,你提到“如果我手动解析 numpy 数组并将通道拆分为 E 通道,这会花费太多时间......”,但很难说出为什么会这样看到代码。上面是O(height*width),对于一个像素级的图像处理方法来说似乎是合理的。
我想知道如何在 Python.
中快速有效地获取 RGBE 格式的像素值来读取 HDR 图像 (.hdr)这些是我尝试过的:
import imageio
img = imageio.imread(hdr_path, format="HDR-FI")
或者:
import cv2
img = cv2.imread(hdr_path, flags=cv2.IMREAD_ANYDEPTH)
这会读取图像,但会以 RGB 格式给出值。
如何在不改变 RGB 值的情况下获得第 4r 个通道,即每个像素的“E”通道? 我更喜欢只涉及 imageio 的解决方案,因为我只能使用该模块。
如果您更喜欢 RGBE 表示而不是浮点表示,您可以在两者之间进行转换
def float_to_rgbe(image, *, channel_axis=-1):
# ensure channel-last
image = np.moveaxis(image, channel_axis, -1)
max_float = np.max(image, axis=-1)
scale, exponent = np.frexp(max_float)
scale *= 256.0/max_float
image_rgbe = np.empty((*image.shape[:-1], 4)
image_rgbe[..., :3] = image * scale
image_rgbe[..., -1] = exponent + 128
image_rgbe[scale < 1e-32, :] = 0
# restore original axis order
image_rgbe = np.moveaxis(image_rgbe, -1, channel_axis)
return image_rgbe
(注意:这是基于RGBE参考实现(found here),如果确实是瓶颈,可以进一步优化。)
在你的评论中,你提到“如果我手动解析 numpy 数组并将通道拆分为 E 通道,这会花费太多时间......”,但很难说出为什么会这样看到代码。上面是O(height*width),对于一个像素级的图像处理方法来说似乎是合理的。