白平衡(颜色抑制)公式?

时间:2015-11-17 23:33:18

标签: javascript python image-processing colors rgba

我需要一点颜色数学帮助。(RGBA)我正在尝试减少角色上的绿色数量,而不会实际影响绿色背景。视觉效果的绿色屏幕。

所以这就是我所拥有的:

我有一个绿屏的人。 Original

使用表达式:g>(r+b)/2 ? (r+b)/2:g 表达式表示如果绿色值大于红色和蓝色之和除以2,则绿色将设置为该总和。运行该表达式将为我提供第二个图像。 你可以看到绿色从我想要的那个人那里完美地移除了,但它也从背景中取出绿色并使其变灰,这是我不想要的。

enter image description here

此处的图像是去除了多少绿色。我通过从第二个图像中减去第一个图像来得到这个。所以它是两者之间的区别。

enter image description here

有人可以帮我弄清楚我怎么只能通过表达/公式从男人而不是背景中移除绿色?我试图夹住绿色,意思是,写一个表达式,表示:对于任何低于某个值的绿色像素,不等于背景绿色,将其变为黑色。这种方法很有效,但它对头发的细微边缘非常苛刻。

以下是通过大量色彩校正和分级实现的理想结果。我希望通过表达得到这个结果。

enter image description here

这是最终结果。看起来不错。此图像是从角色消失的绿色,但不是背景。我通过将上面的图像添加到第二个图像得到了这个。我做了一个分屏,所以你可以看到差异。在夹克和头发中最常见。

enter image description here

2 个答案:

答案 0 :(得分:3)

我不是这方面的专家,但是:

我认为你的方法并不像你想要的那样(从物理方面)。

绿色背景照在你的角色上,为角色表面添加光线。所以你需要删除它(不必要的光)。您将所有绿色像素变为灰色,而我认为这是错误。如果你的家伙有绿色T恤怎么办?

我会这样做:

首先,我希望你的场景设置能够获得无缝照明条件,否则如果没有适当的3D照明/散射分析,这将无法工作,这是一项艰巨的任务,你也需要完整的场景3D模型。

  1. 首先检测散落到物体位置的光线量。

    只需将白纸放在人的大致位置即可。拍照。然后,您会发现工作表的图像计算其平均颜色并计算添加到白色的绿色。

    c[i]=c0[i]+c0[i]*m[i]
    
    • c像素颜色(纸张的平均颜色)
    • c0对象颜色(真实对象颜色......白色,但应与c成比例,如果无法访问场景舞台设置,可能会有点棘手)
    • m缩放(这是我们需要的)
    • i频道

    这将导致3个线性方程组的系统,从而计算出m。这在背景颜色上是不变的,因此它适用于任何颜色...

    我没有从你的套装中看到白色薄饼的图像所以我使用了牙齿。问题是从皮肤/肉周围照射的红色太多,所以我只使用蓝色通道进行补偿。这不准确,但它会做(除非背景照亮另一个通道)...所以对于提取的牙齿图像平均颜色:

    teeth <-这是我用过的拔牙图像

    float m[green]=float(avg[green]-avg[blue])/float(avg[blue]);
    
    • c0是平均颜色的蓝色通道
    • c是平均颜色的绿色通道

    m的所有其他通道都为零(对于这种情况)。不要忘记m[]float !!!。

  2. 现在只需删除图像中的光照

    按照相同的等式计算c0所以:

    c0[i]=c[i]/(1.0+m[i])
    
    • c未经修正的图片像素颜色
    • c0更正后的图片像素颜色
    • m比例(在步骤#1中计算)
    • i频道(R,G,B)

    每个像素执行每个通道...这是原始图像c

    original greenish

    这是经过更正的图片c0

    corrected

    这是c-c0

    的减法

    sub mask

    正如你所看到的那样,绿色也会从背景中被带走,但这样就可以了,因为背景也是如此!它应该是手腕更绿,但我认为这是因为它距离我校准的牙齿太远而且可能太靠近墙壁......因为这也高度依赖于物体位置(如果照明是不是很无缝)更不用说它在阴凉处......

答案 1 :(得分:1)

谢谢大家的想法和想法。每一条评论都引发了我的兴趣,我认为,这是最接近解决方案的。 它确实需要更多的工作。如果你仔细看看他的拳头,你可以看到它突破了。下一步是建立可调整值以影响效果的权重。

enter image description here enter image description here