从Blender中的查看器节点检索到的像素比实际渲染的图像暗。。。为什么?

2024-04-16 17:18:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图创建一个管道,首先使用blender python API(我使用blender 2.90)渲染图像,然后用python执行一些图像处理。我想直接从blender中获取图像,而不必先将渲染图像写入磁盘,然后再次加载。为此,我在blender 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")

问题:我从查看器节点获得的图像比以常规方式保存的图像(good image)暗得多(bad image)。有人知道为什么会发生这种情况以及如何解决吗?blender对像素值的处理是否与我预期的不同

一些补充资料: 在转换为uint8之前,暗图像中的alpha通道的值为1.0(实际上应该是这样)。暗图像中的背景值不是0.0或负值(从外观上可以猜到),而是0.05

我尝试的是: 我认为像素可以在-1到1的范围内缩放,所以在转换到uint8之前,我将像素重新缩放到0到1的范围。。。也没有生成正确的图像:(


Tags: 图像imageimportnodetreeimgasnp
1条回答
网友
1楼 · 发布于 2024-04-16 17:18:27

这是因为在进行颜色管理之前,从Viewer Node获得的图像是“直接合成”的图像。您可以查看文档here:此图像仍在线性空间中

另一方面,您的good_image.png是在转换为“显示空间”后获得的(参见文档中的图表)。因此,它被转换成一个日志空间,可能是伽马校正的,等等

最后,您可以通过调用bpy.data.images['Viewer Node'].save_render(filepath)从查看器节点获得与良好图像接近(但略有不同)的图像,但是如果不先渲染到文件,就无法直接提取颜色管理的版本。您可以通过将PyOpenColorIO添加到脚本中并应用此模块中的颜色管理来自己完成

相关问题 更多 >