已应用到项目的抠绿方案:CbCr空间抠绿原理与计算方式

日期: 2025-03-31 18:12:54 |浏览: 3|编号: 87418

友情提醒:信息内容由网友发布,本站并不对内容真实性负责,请自鉴内容真实性。

已应用到项目的抠绿方案:CbCr空间抠绿原理与计算方式

使用Unity着色器实现透明度绿色拾取(字母)

这是已应用于某些项目的绿色切割解决方案。 1。使用CBCR空间切成绿色

YCBCR:是一个色彩空间,通常用于视频中的连续图像处理或数字摄影系统中。 y'是颜色的Luma组成部分,

CB和CR是蓝色和红色浓度偏移组件。 y'和y是不同的,y是所谓的亮度,代表光的浓度和非线性,用于编码伽马校正。

计算代码:

float3 RGB_To_YCbCr(float3 rgb) {
	float Y = 0.299 * rgb.r + 0.587 * rgb.g + 0.114 * rgb.b;
	float Cb = 0.564 * (rgb.b - Y);
	float Cr = 0.713 * (rgb.r - Y);
	return float3(Cb, Cr, Y);
}

但是在这里我们不需要那么复杂,我们将其变成一种更简单的计算方式

float2 RGB_To_MyCbCr(float3 rgb) {
	float Cb = rgb.b - rgb.g;
	float Cr = rgb.r - rgb.g;
	return float2(Cb, Cr) * 0.5 + 0.5;
 }

这样,每种颜色都可以通过此功能获得其CBCR坐标,因此相应的CBCR坐标:绿色(0,0),黑白:(0.5,0.5),紫色(1,1)。通过距我们选择的颜色的距离(绿色),我们可以确定是否应切割或保留该颜色。

通过这种方式,我们可以选择带扣绿色的颜色,带扣绿色的最小裁剪距离以及最大保留距离(计算时,裁剪距离R && g> b)。

其次,g或增加rb的特定量取决于该颜色的亮度以及距其最小距离的G和R或B通道之间的差异。

float getColorLuminance(float4 rgb) //获取颜色亮度
{
	return (0.299 * rgb.r + 0.587 * rgb.g + 0.114 * rgb.b);
 }

 亮度 = getColorLuminance();
暗度 = 1 - 亮度;
最大变换量 = (c.r > c.b)?(c.g - c.r):(c.g - c.b);
红蓝颜色增量 = 亮度 * 最大变换量;
绿色减量 = 暗度 * 最大变换量;

从图像来看,图像的透明区域已经透明,没有绿色外观。但是,肉眼可能仍然发现现场有绿色。我们的肉眼觉得黄色比橙色更绿,因此,如果黄色旁边是橙色,那么黄色看起来有点绿。因此,我们还需要颜色校正。

4。颜色校正处理

场景中的物体被光照亮,最后聚集在相机上以查看当前图像,因为我们在房间里,我们可能会被绿色屏幕或绿色棚子的弥漫光传递,并反射多余的绿色。此步骤是去除这些弥漫性绿色。

Assuming that the light in the screen space is uniform, only diffuse reflection (the degree of specular reflection of the green screen or green shed is very low), based on the green reflection of the object, the corresponding green absorption rate of the current color block can be calculated (for example, theoretically, the absorption rate of black and white to green is different, and if the uniform diffuse green light in the scene is hit, the increased G value will be different).因为此步骤的目的是减少绿灯对场景的影响,所以可以忽略图片的亮度(而不是处理RB通道)。

完成:

在[0,1]的场景中设置绿光弥漫强度绿色强度,0是最强的(维持当前的图像状态,不处理图像颜色),而1是最弱的。

因此,理论代码就是这样:

fixed overMainColor = c.g * greenIntensity;
c.g = lerp(c.g, overColorGreen, c.g);

但是为了更好的结果,LERP的程度可以更改为校正率,该校正率更接近我们选择的实际颜色

首先计算最多要校正的颜色,然后根据假设的绿光弥漫强度和校正率计算最终颜色

fixed rectify = 使用简单去绿之前的颜色值进行上图取值;
fixed overMainColor = c.g * greenIntensity;
c.g = lerp(c.g, overColorGreen, rectify);

提醒:请联系我时一定说明是从铂牛网上看到的!