抠图技术初探

图像抠图英文名叫 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 算法

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

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

发表于

我来说两句

1 条评论
登录 后参与评论

相关文章

来自专栏数据科学与人工智能

【陆勤践行】SVM之核函数

前段时间热映的《星际穿越》想必大家都看过,在这部烧脑大片中,主角库珀进入到了高维度空间,在那里,时间这个维度变成实体存在,人们可以像散步一样沿着时间这个维度来回...

1928
来自专栏AI科技评论

纽约大学神经学教授Eero Simoncelli万字解析:机器生成的图像为何能骗过你的眼睛?

AI科技评论按:在刚刚闭幕的ICLR2017上,纽约大学神经学、数学、心理学教授Eero Simoncelli作为特邀嘉宾分享了他在机器表征、人类感知方面的研究...

3568
来自专栏数说工作室

【分类战车SVM】第五话:核函数(哦,这实在太神奇了!)

分类战车SVM (第五话:核函数 修正版) 转载请注明来源 微信公众号:数说工作室 新浪微博:数说工作室网站 前段时间热映的《星际穿越》想必大家都看过,在这部...

34412
来自专栏新智元

【卷积神经网络失陷】几行Python代码搞定,偏要用100个GPU!

【新智元导读】Uber近日一篇论文引起许多讨论:该论文称发现卷积神经网络一个引人注目的“失败”,并提出解决方案CoordConv。论文称CoordConv解决了...

1170
来自专栏AI科技评论

「糟糕」的策略梯度

AI 科技评论按:强化学习(reinforcement learning)是机器学习界近几年的一大研究热点,无需先验知识、在环境中反复摸索尝试获得高反馈(rew...

2715
来自专栏数说工作室

【分类战车SVM】第五话:核函数(哦,这实在太神奇了!)

分类战车SVM (第四话:拉格朗日对偶问题) 转载请注明来源 微信公众号:数说工作室 新浪微博:数说工作室网站 前段时间热映的《星际穿越》想必大家都看过,在这...

2835
来自专栏AI科技评论

BAT资深算法工程师「Deep Learning」读书系列分享(一)

AI科技评论按:「Deep Learning」这本书是机器学习领域的重磅书籍,三位作者分别是机器学习界名人、GAN的提出者、谷歌大脑研究科学家 Ian Good...

36012
来自专栏AI科技评论

开发 | 分分钟带你杀入Kaggle Top 1%

AI科技评论按,本文首发于知乎专栏AI带路党,作者吴晓晖,AI科技评论获其授权转载。 不知道你有没有这样的感受,在刚刚入门机器学习的时候,我们一般都是从MNIS...

33410
来自专栏大数据挖掘DT机器学习

深度学习word2vec笔记(基础篇)

一.前言 伴随着深度学习的大红大紫,只要是在自己的成果里打上deep learning字样,总会有人去看。深度学习可以称为当今机器学习领域的当之无愧的巨星,也特...

3534
来自专栏量子位

DeepMind的脑补AI再获新技能:看文字知场景、复杂环境、连续视频……

682

扫码关注云+社区