首页 > 编程语言 >揭秘绿幕抠图算法技术

揭秘绿幕抠图算法技术

时间:2023-07-21 09:57:10浏览次数:43  
标签:颜色 Keying 绿幕 色度 亮度 技术 算法 揭秘

 

绿幕抠图为什么是“绿幕”呢?人眼的感光系统和摄像机的感光芯片采集的色彩中,最常见的就是红、蓝、绿三原色。红色在演员服饰和物体中较为常见,不利于背景分离;绿色则是人体肤色最少的颜色,人眼对绿色最为敏感,而相机也是模仿人眼的设计,CMOS 采集信息是按照 RGGB,其信号最强、噪波最少,包含了大部分的亮度信息,所以很容易找到对比度,在直播中绿幕比蓝幕更常用。

常用的移动端实时绿幕抠图技术主要包括:色差抠图技术(Color Difference Keying)、亮度抠图技术(Luma Keying)以及色度抠图技术(Chroma Keying)。

色度抠图技术(Chroma Keying)
色度抠图算法则是在 HSV 彩色空间中进行,其中 H 表示色调、即是什么颜色,S 表示饱和度即该颜色有多浓,V 表示亮度即该颜色有多亮。色度键算法需要提前手动选择背景颜色,通过计算整幅图像和背景颜色的距离或称相似度来判断哪些颜色属于背景,哪些颜色属于前景,由此得到最终的 alpha 图。
色度抠图技术利用图像的颜色信息求解不透明度。色度抠图技术将彩色图像转换到 HSV 空间,然后对色度分量(H)进行软阈值分割。在实际应用中,受光照等环境因素的影响,色度分量不能完全区分颜色信息,需要对色度(H)、饱和度(S)和亮度(V)三通道加权求解不透明度。由于其快速并且能得到比较好的绿幕抠图效果,色度抠图技术被广泛应用在实时场景。

HSV 颜色空间模型

亮度抠图技术(Luma Keying)
亮度抠图算法指将一幅彩色图像转为单通道的黑白图像,这幅黑白图像就代表着该图像的亮部和暗部区域。通过设置最低亮度和最高亮度两个阈值,将符合该条件的区域保留,不符合的去除,由此就生成了一张 alpha 图,然而这种方法直接生成的 alpha 图通常有比较多的瑕疵,还需要进行二次处理。
亮度抠图技术利用图像的亮度信息,对其进行软阈值操作来求解不透明度。即在 HLS 空间对亮度分量 L 进行软阈值操作,从而得到从 0 到 1 平缓变化的。然而该技术只考虑了图像的亮度信息,忽略了图像的颜色信息,因此对于大部分图像的效果不是十分理想。


色差抠图技术(Color Difference Keying)
色差抠图算法是在 RGB 彩色空间中进行,利用 R、G、B 三通道的颜色差异来求解不透明度,处理速度非常快,但采用RGB空间不能很好地分离绿色,进行处理后得到的输出结果较为突兀,边缘分割明显,前景细节丢失,绿色溢出较为严重。

RGB颜色空间模型

以上三种是常见的绿幕抠图技术,但因环境光线不同,绿布颜色不同,绿布亮度不统一,以及前景目标中包含绿色成分等因素,在实际中会存在着大量的干扰信息。所以要实现抠图的边缘平滑,优秀的控制绿色溢出问题,并且能保留原图中的阴影,对于透明物体也可以达到视觉最优的效果,做到真正亚像素级抠图效果,都是需要针对每个因素进行算法优化的,更多细节访问蓝松抠图SDK

 

标签:颜色,Keying,绿幕,色度,亮度,技术,算法,揭秘
From: https://www.cnblogs.com/toby0405/p/17570446.html

相关文章

  • 遗传算法 深度学习
    遗传算法与深度学习1.遗传算法和深度学习的概述遗传算法和深度学习是两种不同的优化算法,它们在解决问题时有着不同的应用场景和方法。遗传算法是一种通过模拟生物进化过程中的自然选择和遗传机制来寻找最优解的优化算法。而深度学习则是一种通过神经网络模型来学习和识别复杂的......
  • 每日算法之四十六:Add Binary(二进制字符创相加)
    二进制字符创相加,通过进位的方式逐位考虑。也可以把相加的过程抽象成一个函数。Giventwobinarystrings,returntheirsum(alsoabinarystring).Forexample,a= "11"b= "1"Return "100".方法一:classSolution{public:stringaddBinary(stringa,string......
  • 每日算法之四十:Insert Interval
    Givenasetof non-overlappingYoumayassumethattheintervalswereinitiallysortedaccordingtotheirstarttimes.Example1:Givenintervals [1,3],[6,9],insertandmerge [2,5] inas [1,5],[6,9].Example2:Given [1,2],[3,5],[6,7],[8,10],[12,16],inser......
  • 上班摸鱼刷算法-Java-hot100-[160]相交链表
    publicclassSolution{publicListNodegetIntersectionNode(ListNodeheadA,ListNodeheadB){if(headA==null||headB==null){returnnull;}ListNodepA=headA;ListNodepB=headB;while(pA......
  • 上班摸鱼刷算法-Java-hot100-[21]合并两个有序链表
    //将一个链表插入到另一个链表中classSolution{publicListNodemergeTwoLists(ListNodelist1,ListNodelist2){if(list1==null){returnlist2;}if(list2==null){returnlist1;}retur......
  • 揭秘|来看看袋鼠云数栈内部的资产血缘方案设计与实现
    数据资产现在需要接入数栈内部相关应用的时候,支持查看血缘的类型从表、离线任务增加到需要表、离线任务、实时任务、API任务、指标、标签等,需要支持数栈现有的所有应用任务,最终实现在数据资产平台查看任务的完整应用链路。虽然增加不同的任务,现阶段资产实现的血缘大体上能够满足......
  • java十大算法
    Java十大算法Java是一门广泛应用于大量软件开发领域的编程语言。在Java的生态系统中,有许多重要的算法和数据结构,这些算法和数据结构在各个领域中被广泛使用。在本文中,我们将介绍Java中的十大算法,并通过代码示例来解释它们的工作原理。1.排序算法排序算法是计算机科学中最基本和......
  • 6大常用基础算法
    6大常用基础算法1冒泡排序(BubbleSort)基本思想两个数比较大小,比较大的数下沉,比较小的数冒起来。时间复杂度O(n)2代码```inta[]={15,4,3,2,8,0,7};intlength=sizeof(a)/size(a[0]);voidasd(inta[],intlength){inttemp;for(inti=0;i<length-1;i++){......
  • 装饰器/递归/算法
    多层装饰"""语法糖会将紧挨着的被装饰对象的名字当做参数自动传入装饰器函数中"""#判断七句print执行顺序defoutter1(func1):print('加载了outter1')打印顺序③和前面的定义对应defwrapper1(*args,**kwargs):print('执行了wrapper1')打印顺序④......
  • C#城市线路图的纯算法以及附带求极权值
    ​ 常用的数据结构写出来纯属于算法性方面还有待提高时间复杂度最坏情况下O(2^n) 最优:O(n^2)线路图为双向带有权值 比如A-B距离是5000km那么B-A有可能不是5000km所以我在LoadData方法时候没做交换变量直接存放在集合里面以起点递归查找下一连接点并返回当作起点节......