图像算法研究---背景虚化算法

来源:互联网 发布:sql 数据库自动删除 编辑:程序博客网 时间:2024/05/01 23:52

背景虚化算法研究

一,背景虚化特点研究

玩单反的人经常会使用背景虚化来拍摄一些很漂亮的照片,但是,单反毕竟不是每个人都可以玩的,因此,出现了很多软件算法来实现的背景虚化效果。

我们要实现背景虚化,首先要了解单反拍出的背景虚化的照片有什么特点,只有这样,才能写出更接近真实的算法。

经过我的总结,背景虚化有如下几个特点:

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,欢迎交流讨论图像算法!

原创粉丝点击