玩单反的人经常会使用背景虚化来拍摄一些很漂亮的照片,但是,单反毕竟不是每个人都可以玩的,因此,出现了很多软件算法来实现的背景虚化效果。
我们要实现背景虚化,首先要了解单反拍出的背景虚化的照片有什么特点,只有这样,才能写出更接近真实的算法。
经过我的总结,背景虚化有如下几个特点:
1,聚焦的物体成像要清晰(也就是焦平面内要清晰);
2,焦平面之外的景物成像是模糊的;
3,距离焦平面越远,模糊程度越大,反之,越小(即模糊随着景深不同而不同);
4,焦外成像二线性问题;
现在很多手机厂商都在用图像算法做背景虚化,但是在单摄像头的情况下,效果却都不尽人意,这里举个例子来说明一下。
下面这张图是华为荣耀6Plus的效果图:
这张图至少有三个问题:
①在人和依靠的树所在的焦平面内,人头和鞋子两个地方是模糊的,不是清晰的;
②美女的长腿与树之间的缝隙是不属于焦平面的,应该是模糊的,而不是清晰的;
③焦平面外的模糊应该是渐进的模糊,而不是均匀的,这个图明显是均匀的;
据说最新的华为手机效果不错,具体本人没有找到相应的测试,有兴趣的可以试一下;
这里我们也给一个相对而言看起来比较真实一点的测试图:
上面这两张图是XSHOT的原图和效果图,单看效果,图3聚焦在一两朵花上,也就是焦平面在花上,这个平面上是很清晰的,除此之外的地方,也是渐进模糊的,距离这朵花越远的地方,模糊程度也越强。
对于双摄像头的背景虚化,实际上是利用两个摄像头的位置信息,计算成像的景深等等,来结合算法实现的效果;由于采用了两个摄像头,因此,效果要比单摄像头单纯的算法实现要好,这里给出iphone7P的效果图,该图也来自网络:
上面我们详细的说了一下背景虚化的特点,针对最后一点焦外二线性,实际上是这样的:对于单反,绝大多数镜头在全开光圈的时候,光圈都是圆形的,此时的焦外成像就代表了镜头设计的本性;当收缩光圈拍摄时表现出来的焦外成像,是镜头设计的本性和光圈形状共同作用的结果。一些镜头在全开光圈时可以表现出很好的焦外成像,但是在收缩光圈后,由于光圈的非圆形,会破坏焦外成像内容。
一般来说,好的虚化应该是按对焦点远近过渡均匀连续的,在焦外成像中没有明显的边缘残留,如图6所示;而图5中,虚化的物体的轮廓不是均匀散焦的,而是被数条线分开,形成一些类似小气泡的东西,这就是焦外二线性。
这里我所讲的是单摄像头情况下的算法实现;
我们先给一个简单的PS流程:http://www.ps-xxw.cn/tupianchuli/5930.html
这个PS实现,实际上也是按照我前面所说的三个背景虚化的特点来实现的,具体大家可以试一下,感受一下;
下面说一下我这里的算法流程如下:
1,聚焦物体抠图(构建焦平面);
2,焦平面之外的背景模糊;
3,焦平面之外的背景渐进模糊变换;
4,焦外二线性;
对于1聚焦物体抠图,常用的有传统的贝叶斯抠图算法、Graph Cut、Alpha mat等,以及深度学习相关的抠图算法等等。
参考论文如下:
《Interactive graph cuts for optimal boundary and region segmentation of objects in N-D images》
《Shared Sampling for Real-Time Alpha Matting》
《A Closed Form Solution to Natural Image Matting》
《A Bayesian Approach to Digital Matting》
《Learning Based Alpha Matting using Support Vector Regression》
《Natural Image Matting using Deep Convolutional Neural Networks》
《Deep Image Matting》
这一步骤,假设原图为S,抠图得到目标图像之后,我们需要构建一个焦平面Mask,然后对该Mask进行高斯滤波,得到一个有边缘过度的Mask;
如下图所示:
针对2背景模糊,我们可以直接对原图进行高斯模糊,得到模糊图像G;
针对3渐进模糊,我们需要在焦平面的中心点,向外构建一个比例系数,构成一个扩散系数,距离焦平面中心点越远,扩散系数越大,对应的模糊程度也越大,这里我假设为K;
上述三点完成之后,我们做如下处理:
Output = S*Mask+(255-Mask)*G
这个公式计算出来的效果是背景模糊均匀的背景虚化效果;
如下图所示:
要构建渐进模糊,需要两个步骤:
①我们需要先计算焦平面的中心,这个中心点计算公式如下:
实际上也就是质心计算公式,这里我们计算出的质心为(x0,y0);
②以(x0,y0)为中心,向外计算可变半径高斯模糊,即距离中心越远的地方高斯半径越大,反之越小,具体可以参考比例系数K;
这一步得到的效果是有渐进模糊的背景虚化效果,同时,过渡区域也比较自然;
这里我给个我的测试图:
大家可以看到这个图中,聚焦平面(一朵花)是很清晰的,聚焦平面外事渐进模糊的,有一种景深的感觉。
对于焦外二线性的效果,可以在景深比较深也就是距离焦平面比较远的地方,添加不同镜头二线性形状的光斑,与虚化后的图进行融合,至此,就更加具有真实感了。
除此之外,我们还可以对焦平面内图像内容进行清晰度增强处理,这样效果上聚焦就更明显了,给出添加清晰度后的效果图:
具体代码就不写了,本文主要探讨方法,方法有了,代码只是水到渠成的事情。
最后,给出一个C#调用C实现的DEMO看下效果:点击打开链接
本人QQ1358009172,欢迎交流讨论图像算法!