6

我只是想将 EXR 转换为 jpg 图像,但结果却很暗。有谁知道我在这里做错了什么?我正在标准化图像值,然后将它们放入 0-255 色彩空间。它仍然看起来不正确。

用于测试 exr 图像的 Dropbox 链接:https ://www.dropbox.com/s/9a5z6fjsyth7w98/torus.exr?dl=0

在此处输入图像描述

import sys, os
import imageio

def convert_exr_to_jpg(exr_file, jpg_file):
    if not os.path.isfile(exr_file):
        return False

    filename, extension = os.path.splitext(exr_file)
    if not extension.lower().endswith('.exr'):
        return False

    # imageio.plugins.freeimage.download() #DOWNLOAD IT
    image = imageio.imread(exr_file, format='EXR-FI')

    # remove alpha channel for jpg conversion
    image = image[:,:,:3]

    # normalize the image
    data = image.astype(image.dtype) / image.max() # normalize the data to 0 - 1
    data = 255 * data # Now scale by 255
    rgb_image = data.astype('uint8')
    # rgb_image = imageio.core.image_as_uint(rgb_image, bitdepth=8)

    imageio.imwrite(jpg_file, rgb_image, format='jpeg')
    return True


if __name__ == '__main__':
    exr = "C:/Users/John/images/torus.exr"
    jpg = "C:/Users/John/images/torus.jpg"
    convert_exr_to_jpg(exr, jpg)
4

2 回答 2

3

示例图像是具有16 位深度(通道)的 EXR 图像。这是一个使用opencv将 exr 图像转换为png的 python 脚本。

import numpy as np
import cv2
im=cv2.imread("torus.exr",-1)
im=im*65535
im[im>65535]=65535
im=np.uint16(im)
cv2.imwrite("torus.png",im)

在此处输入图像描述

这是带有imageio的修改后的代码,它将以jpeg格式保存图像

import sys, os
import imageio

def convert_exr_to_jpg(exr_file, jpg_file):
    if not os.path.isfile(exr_file):
        return False

    filename, extension = os.path.splitext(exr_file)
    if not extension.lower().endswith('.exr'):
        return False

    # imageio.plugins.freeimage.download() #DOWNLOAD IT
    image = imageio.imread(exr_file)
    print(image.dtype)

    # remove alpha channel for jpg conversion
    image = image[:,:,:3]


    data = 65535 * image
    data[data>65535]=65535
    rgb_image = data.astype('uint16')
    print(rgb_image.dtype)
    #rgb_image = imageio.core.image_as_uint(rgb_image, bitdepth=16)

    imageio.imwrite(jpg_file, rgb_image, format='jpeg')
    return True


if __name__ == '__main__':
    exr = "torus.exr"
    jpg = "torus3.jpeg"
    convert_exr_to_jpg(exr, jpg)

在此处输入图像描述

(使用 python 3.5.2、Ubuntu 16.04 测试)

于 2019-06-14T07:49:17.340 回答
0

我遇到了同样的问题,并在这里修复了它。因为 ImageIO 将所有内容都转换为 numpy 数组,所以您可以对值进行伽玛校正(修复黑暗问题),然后将其转换回 PIL 图像以轻松使用:

im = imageio.imread("image.exr")
im_gamma_correct = numpy.clip(numpy.power(im, 0.45), 0, 1)
im_fixed = Image.fromarray(numpy.uint8(im_gamma_correct*255))

我在你非常漂亮的圆环结上测试了这个,效果很好。如果您需要更完整的代码片段,请告诉我,但我认为以上回答了您的实际问题。

于 2019-10-24T22:26:48.000 回答