catalpa-bungei 发表于 2023-6-22 21:42:05

white_bkgd的实现机理

nerf 代码中有一段:
      if args.white_bkgd:
            images = images[...,:3]*images[...,-1:] + (1.-images[...,-1:])
其中image的形状为
求大佬解释一下其中原理

isdkz 发表于 2023-6-22 21:53:56

args.white_bkgd 可能是一个标志,用于决定是否对图像背景应用一个白色填充。这在处理具有透明度(alpha通道)的图像时特别有用。在这段代码中, images 可能是一个4D张量,包含一批具有透明度的图像。

在这段代码中:
images = images[...,:3]*images[...,-1:] + (1.-images[...,-1:])

images[...,:3] 代表取图像的RGB通道, images[...,-1:] 代表取图像的透明度通道。然后使用这两个通道进行计算以生成新的图像。

让我们分步解析这个公式:

1.images[...,:3]*images[...,-1:] :这部分代码的作用是让图像的RGB通道与其对应的透明度通道相乘。透明度通道的值通常在0到1之间,0代表完全透明,1代表完全不透明。这意味着,如果一个像素的透明度为0,那么相乘后的结果也为0,即该像素在新图像中将完全透明。如果透明度为1,那么相乘后的结果就是原来的RGB值,即该像素在新图像中将保持原样。

2.1.-images[...,-1:] :这部分代码的作用是计算图像的透明度通道的补值,即1减去透明度通道的值。这意味着,如果一个像素的透明度为0,那么这部分的结果为1,如果透明度为1,那么结果为0。

3. 最后,将上述两部分的结果相加。这意味着,对于完全透明的像素(透明度为0),它们在新图像中将被填充为白色(因为透明度通道的补值为1,加上RGB通道乘以透明度的结果为0,所以最终结果为1,即白色)。对于完全不透明的像素(透明度为1),它们在新图像中将保持原样(因为透明度通道的补值为0,加上RGB通道乘以透明度的结果为原来的RGB值,所以最终结果为原来的RGB值)。

因此,这段代码的作用是将图像的透明背景填充为白色,同时保留非透明部分的原始颜色。
页: [1]
查看完整版本: white_bkgd的实现机理