申请会员ID:cheetaher
1、申请ID:cheetaher2、个人邮箱:xyzhangyu@gmail.com
3、原创技术文章:绿屏抠图
本帖已在CSDN上发表过。个人主页
声明:本文核心算法(alpha求解)基于论文Shared Sampling for Real-Time Alpha Matting进行;
原理:
理论分析以及方案确定
本章主要对绿色视频特征进行了分析,并按照分析进行了一些简单实验以确定分析是否正确。同时也讨论了一种比较常用的抠图算法。因为视频的处理就是图片的一帧一帧的处理,所以本章以下内容讨论的都是单张图片的分析。
2.1 色差法进行图像分割
通过观察绿屏视频发现,只有背景有绿色,前景物体上几乎没有绿色。所以首先考虑是否可以直接根据颜色滤除背景。因为输入图像是RGB格式,其颜色分布空间如图2.1所示。在RGB空间中进行颜色差异的判断可能效果不明显,所以首先将其转换到HSV颜色空间,HSV颜色空间的颜色分布如图2.2所示,在进行颜色区分时可以主要依据H通道就可以得到较好的效果
根据颜色差异,对输入图像的颜色进行判断,并以此得到掩膜mask。当原图像中某一像素属于绿色的背景时,令mask中该位置的值为0,否则为255。这样可以得到一张包含前景和背景区域的mask图像,依据这一张图,进行图像的合成。也就是让输出图像在mask为0时的像素值等于背景图像在该点的像素值,否则为绿色背景图片的像素值。这样就能得到一副简单的合成图像。
但是根据色差法进行处理得到输出结果较为突兀,边缘分割明显,前景细节丢失,绿色溢出较为严重。所以这种方法知识和简单分析,没有实际用处。
2.2 基于α图的抠图
在将两张图片进行合成的过程中,为了消除边缘的突变,我们需要在边缘处对图像进行加权叠加。同理,对于前景图像的细节部分,因为其大小可能小于一个像素点,所以也要按照加权的方式进行叠加。这样关键问题就转化为了权重的选取,也就是α值的选择。我们定义α为单个像素的不透明度,和分别为前景和背景像素的颜色值, 为叠加后的像素色彩值,则前景和背景的进行叠加应该满足公式(2.1)。
在进行抠图与图像合成中,最重要的就是求得alpha在各个像素点处的值。由于我们选择了在绿幕背景下拍摄前景人物的动作,故我们的操作对象具有以下特点:
1.背景和前景主体部分容易获得;
2.背景和人物分离明显,背景为绿色,且前景人物具有一定的活动范围;
3.前景图像边缘的细节,毛发等的alpha值未知。
因此我们需要针对对象特点进行相应的算法设计,可以首先把前景图像从RGB空间转换到HSV空间中,然后对图像进行二值化,接着进行形态学操作后进行滤波,可以得到明显的前景和背景。此时前景中的绿幕的像素值全为0而人物的像素值全为255,而在中间人物边缘和绿幕交接的地方,出现了像素值结于0到255之间的区域,我们称之为未知区域。获取alpha的值,主要任务也就转化为了求解位置区域的alpha的值以及位置区域的大小。对于未知区域的alpha值,我们可以通过选择一对前景和背景点来进行计算。Alpha的计算可以分为以下几个步骤。
2.2.1 获取样本对
这一步主要是找到未知区域中像素点p的候选样本点。为了寻找这些样本点,从p点引出条射线,并记录每条射线碰到的第一个前景或是背景点,否则到图像边界,这样最多可以找到个前景点和个背景点作为样本点。为了让p临近区域的一点q找到的样本点有较大不同,在p的临近区域的点,其引出的射线按照一定的角度进行偏移。过程如图2.3所示,图中方格内的圆点代表找到的前景点,四方形代表找到的背景点。最多有个样本对。找到候选样本点,下一步是确定使用哪一对点进行计算。
2.2.2 选择样本对
首先分析,若是最后计算出的alpha值合理,则用这个值对前景点和背景点进行重新合成后得到新像素点应该有以下几个特点:
重新合成图像与原图像在颜色上的差异小;
选择的样本点距离选择点在图像空间上的距离小;
重新合成的点在图像空间与原像素点有相似性质。
根据这几个特点,我们可以构造一个目标函数如式2.2:
(此处公式太多直接上截图了。可能不清楚,抱歉)
第三章 算法实现与程序设计
经过前面的分析已经我们已经知道alpha具体值的求解方法,在这一章将介绍程序如何设计以及算法的实现。
3.1 总程序设计
系统总体流程图如图3.1所示,首先进行前景目标位置以及大小的设置,设置完毕后开始进行逐帧的处理。首先获得trimap图,也就是包含已知前景、背景以及位置区域的三元图。接着根据trimap与输入原图像进行alpha值的计算。
3.2 Trimap 获取这一步输入前景图像,输出包含三个区域的trimap图,而且此步中对图像进行分割,这样只把包含前景中目标的部分提取出来,会减少计算量提高算法效率。其流程图如图3.2所示。其中获得目标所在区域使用轮廓进行判断。因为二值化之后得到黑白图像,寻找此图像的轮廓,然后判断轮廓大小,滤除过大以及过小的轮廓。然后寻找出轮廓的长宽信息以及最小的x, y值,根据这些信息内即可把轮廓所在区域用一个四方形框起来,也就提取出了目标所在的区域。
最后的形态学操作主要是为了去除掉已知前景和背景中的噪声斑点,同时通过腐蚀与膨胀也能起到改变已知区域大小的作用。形态学运算完毕后对图像进行均值滤波操作,这样目标边缘一部分会变为未知区域,至此,trimap获取完毕。
这里贴一些代码吧 算了不贴了图片大小还有限制,这里有一个31kb的cpp文件应该能说明有内容了
3.3 alpha计算与图片合成得到trimap后,便可以根据第二章的分析对alpha进行计算。对于图片合成,需要注意的一点是因为前景图片在之前的处理中进行过分割,所以并不能直接拿前景与新的背景按照alpha进行加权叠加,应该根据用户设置的位置以及大小,合理的调整叠加开始的位置等。
程序运行:
代码不贴了,直接放链接,管理有兴趣可以看:https://github.com/CNyuzhang/green-screen-video-matting
OK,不知道这种文章能不能过审核啊,望大佬们手下留情。
这有点高级啊,看不懂了,是楼主原创吧? 这个看着很高级啊!一般估计操作不懂 Hmily 发表于 2019-2-25 14:38
这有点高级啊,看不懂了,是楼主原创吧?
我十分抱歉,当时一直显示发帖失败。我还以为没有发成功,所以后来就没看了。原理不是原创,是国外大佬的论文,实现是自己搞得。这都几个月了,好尴尬 我还要回复一下子{:1_924:},这么久没有回复的原因就是当时发帖提交时候一直显示失败。尝试了几次之后遂放弃了。今天在搜索引擎搜我的名字竟然发现了这篇文章!震惊!!还是谷歌第三条,说明本网站影响因子还是蛮高的啊。回复也要审核,在说明,本文算法部分(公式)不是原创,实现是自己搞的,基于C++。
好了,这下还能接着审核吗{:1_936:} 游客 223.73.111.x 发表于 2019-4-20 16:47
我还要回复一下子,这么久没有回复的原因就是当时发帖提交时候一直显示失败。尝试了几次之后遂放 ...
那还是需要提供自己原创的内容进行申请。
页:
[1]