抠图技术初探

图像抠图英文名叫 image matting,顾名思义就是将目标图像从背景中分离出来的一种图像处理技术。根据图像背景的复杂程度,一般分为纯色背景抠图(“绿幕”或者“蓝幕”)和自然图像抠图。

“绿幕”抠图

这项技术主要被用在电影工业中。比如有时看到电影拍摄的场景中周围全是绿色的背景,甚至里面的工作人员也穿着绿色的衣服。这些绿色的背景在后期的处理中会用抠图技术去除,替换上电影中的背景,制作出各种宏大的场景或者特效,比如:

看了这些对比图是不是再也不敢相信自己的眼睛了,同时也要佩服这些演员丰富的想象力。 上面说的就是抠图中最原始的“绿幕”或者“蓝幕”抠图技术,之所以选择绿色和蓝色,是因为这两种颜色和肤色相差最远,同时做为rgb三原色之一也更容易处理。欧美多用绿色,是因为他们有人是蓝眼睛。理论上用其他的纯色背景也是可以的,只是要确保背景和前景不要有重叠的颜色,否则前景中相同颜色的部分也会被扣掉。 下面的代码就用opencv实现了一个最简单的绿幕抠图:  

        mat src = imread("d:\\samplepic\\g1.png");

        mat hsvsrc;

        mat result(src.size(), cv_8uc3, scalar(0,0,0));

        cvtcolor(src, hsvsrc, cv_bgr2hsv);//转换到hsv颜色空间

        for(int i = 0; i < src.rows; i++)

        {

            for (int j = 0; j < src.cols; j++)

            {

                uchar b = src.at<vec3b>(i,j)[0];  

                uchar g = src.at<vec3b>(i,j)[1];  

                uchar r = src.at<vec3b>(i,j)[2];  

             

                uchar h = hsvsrc.at<vec3b>(i,j)[0];  

                uchar s = hsvsrc.at<vec3b>(i,j)[1];  

                uchar v = hsvsrc.at<vec3b>(i,j)[2]; 

                

                if (h > 60 && h <= 130 && s > 100) //判断绿色像素点

                {

                    b = 0;

                    g = 0;

                    r = 0;

                }

                result.at<vec3b>(i,j)[0] = b;  

                result.at<vec3b>(i,j)[1] = g;  

                result.at<vec3b>(i,j)[2] = r;  

            }

        }</vec3b></vec3b></vec3b></vec3b></vec3b></vec3b></vec3b></vec3b></vec3b>

原理是首先将图像的颜色从rgb转换到hsv空间,hsv分别表示:色调(h),饱和度(s),明度(v),通过h来判断大致的绿色的范围,然后将原图中判断为绿色背景的像素点rgb都置为0。

网上找的一张绿色背景图试验的效果:

当然这个只是最简单的处理,当背景不均匀时有可能会有一些残留,或者把前景图像中的某些像素扣掉,同时边缘也还有一些残留的绿色像素和锯齿,要达到理想的效果需要做进一步的处理。

自然图像抠图 绿幕抠图对图像背景有苛刻的要求,现实中蓝绿纯色背景的图片太少,更多的是平时用手机或者相机拍摄的复杂背景的图片,这时候要想分离前景,就需要用到自然图像抠图技术。

自然图像抠图基本都基于这样一种模型: c = αf + (1-α)b 这个模型把原始的图像看成了由前景和背景叠加合成所组成的图,其中:

  • c 为图像当前可观察到的颜色,是已知的
  • f 是前景色,
  • b 背景色,
  • α 不透明度([0,1]区间变化,1为不透明,0为完全透明)。

这个模型表示图像像素的颜色是已经叠加合成过的颜色了也就是c,至于α、f、b都是未知的。而抠图算法就是要把三个变量给解出来。而要解出这些变量需要引入额外的约束信息,这通常需要用户的交互,由用户来指定一些初始的背景和前景的信息。

指定约束信息通常有两种方式: 1. trimap 一般用白色部分表示前景,黑色表示背景,灰色表示待识别的部分

                      原图                                                trimap图 2. scribbles 在前景和背景画几笔的草图。

               原图                             前景scribble                     背景scribble

各种抠图算法做的事情,就是如何更准确更快速地通过用户指定的约束信息估计出未知区域的α、b、f来。抠图算法解出每个像素的α值后就可以生成一张α图,这张图前景是白色的,其余都是黑色的蒙板图,它和原图结合后就完成了抠图。

alphamatting 网站中对历年出现的45种抠图算法进行了评测和排名。评测方法是使用8张不同类型图片做标准,测试每种算法在不同的trimap下对这些图片的抠图效果。从排名来看,2017年新出现的两种算法,抠图的效果相对最好。当然也可以看到没有一种算法是在所有的评测图片中都表现最好,从这里也可以看到自然图像抠图的复杂性。

看下排名靠前的几种算法抠图的效果: information-flow matting 算法

deep matting 算法

看抠图效果是不是很惊叹,头发的细节都能扣出来,然而这些算法运算速度普遍的很慢,要想在实时性要求比较高的场景中使用,需要大量的工程化改进和优化工作。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏量子位

Kaggle优胜者详解:如何用深度学习实现卫星图像分割与识别

王新民 编译 量子位 出品 | 公众号 QbitAI 最近,Kaggle网站举办了一场在卫星图像上进行场景特征检测的比赛,数据集由英国国防科学与技术实验室(DS...

38812
来自专栏AI科技大本营的专栏

入门深度学习,先看看三位顶级大牛Yann LeCun、Yoshua Bengio和Geoffrey Hinton的联合综述

【编者按】深度学习领域的三位大牛Yann LeCun、Yoshua Bengio和Geoffrey Hinton无人不知无人不晓。此前,为纪念人工智能提出60周...

3244
来自专栏机器之心

干货 | 物体检测算法全概述:从传统检测方法到深度神经网络框架

机器之心转载 公众号:阅面科技(ID:readsense) 作者:童志军 物体检测一向是比较热门的研究方向,它经历了传统的人工设计特征+浅层分类器的框架,到基于...

3657
来自专栏AI科技大本营的专栏

AI 技术讲座精选:菜鸟学深度学习(一)

【AI100 导读】在本系列中,你将会学习如何利用深度学习解决那些比较简单的问题。在解决问题的过程中,你不仅会学到深度学习中的某一种类型,也可以在 Keras ...

3458
来自专栏SIGAI学习与实践平台

机器学习中的最优化算法总结

对于几乎所有机器学习算法,无论是有监督学习、无监督学习,还是强化学习,最后一般都归结为求解最优化问题。因此,最优化方法在机器学习算法的推导与实现中占据中心地位。...

1203
来自专栏前沿技墅

猫工智能:卷积神经网络层的实现

1895
来自专栏人工智能头条

深度学习综述:Hinton、Yann LeCun和Bengio经典重读

1703
来自专栏深度学习思考者

图像处理——目标检测与前背景分离

前提     运动目标的检测是计算机图像处理与图像理解领域里一个重要课题,在机器人导航、智能监控、医学图像分析、视频图像编码及传输等领域有着广泛的应用。 ...

38711
来自专栏https://www.cnblogs.com/L

【数学基础篇】---详解极限与微分学与Jensen 不等式

数学基础知识对机器学习还有深度学习的知识点理解尤为重要,本节主要讲解极限等相关知识。

734
来自专栏计算机视觉

西瓜书第二章-模型评估和选择

1.经验误差 错误率——是分类错误的样本数占样本总数的比例 经验误差——学习器预测的结果与实际真实结果之间的差异 训练误差——在训练集上预测的结果与训练集的...

35012

扫码关注云+社区