我正在尝试创建一个管道,在该管道中,我首先使用 blender python API(我使用的是 Blender 2.90)渲染图像,然后在 python 中执行一些图像处理。我想直接从搅拌机中获取图像,而无需先将渲染图像写入磁盘然后再次加载。为此,我在搅拌机 GUI 中运行了以下代码:
import bpy
import numpy as np
import PIL.Image as Image
from skimage.util import img_as_ubyte
resolution_x = 512
resolution_y = 512
# render settings
scene = bpy.context.scene
scene.render.engine = 'BLENDER_EEVEE'
scene.render.resolution_x = resolution_x
scene.render.resolution_y = resolution_y
scene.render.image_settings.file_format = 'PNG'
scene.render.filepath = "path/to/good_image.png"
# create Viewer Layer in Compositor
scene.use_nodes = True
tree = scene.node_tree
nodes = tree.nodes
links = tree.links
for node in nodes:
nodes.remove(node)
render_layer_node = nodes.new('CompositorNodeRLayers')
viewer_node = nodes.new('CompositorNodeViewer')
links.new(viewer_node.inputs[0], render_layer_node.outputs[0])
# render scene and get pixels from Viewer Node
bpy.ops.render.render(write_still=True)
pixels = bpy.data.images['Viewer Node'].pixels
# do some processing and save
img = np.flip(img_as_ubyte(np.array(pixels[:]).reshape((resolution_y, resolution_x, 4))), axis=0)
Image.fromarray(img).save("path/to/bad_image.png")
问题:我从查看器节点获得的图像(坏图像)比以传统方式保存的图像(好图像)要暗得多。有谁知道为什么会发生这种情况以及如何解决它?搅拌机可能会以不同于我预期的方式处理像素值吗?
一些附加信息:在转换为 uint8 之前,暗图像中 alpha 通道的值是 1.0(实际上应该是)。暗图像中的背景值不是 0.0 或负数(从外观上可能会猜到),而是 0.05...
我尝试了什么:我认为像素可能会在 -1 到 1 的范围内缩放,所以我在转换为 uint8 之前将像素重新缩放到 0 到 1 的范围......也没有导致正确的图像:(