1. 程式人生 > >影象演算法研究---背景虛化演算法

影象演算法研究---背景虛化演算法

背景虛化演算法研究

一,背景虛化特點研究

玩單反的人經常會使用背景虛化來拍攝一些很漂亮的照片,但是,單反畢竟不是每個人都可以玩的,因此,出現了很多軟體演算法來實現的背景虛化效果。

我們要實現背景虛化,首先要了解單反拍出的背景虛化的照片有什麼特點,只有這樣,才能寫出更接近真實的演算法。

經過我的總結,背景虛化有如下幾個特點:

1,聚焦的物體成像要清晰(也就是焦平面內要清晰);

2,焦平面之外的景物成像是模糊的;

3,距離焦平面越遠,模糊程度越大,反之,越小(即模糊隨著景深不同而不同);

4,焦外成像二線性問題;

現在很多手機廠商都在用影象演算法做背景虛化,但是在單攝像頭的情況下,效果卻都不盡人意,這裡舉個例子來說明一下。

下面這張圖是華為榮耀6Plus的效果圖:


這張圖至少有三個問題:

①在人和依靠的樹所在的焦平面內,人頭和鞋子兩個地方是模糊的,不是清晰的;

②美女的長腿與樹之間的縫隙是不屬於焦平面的,應該是模糊的,而不是清晰的;

③焦平面外的模糊應該是漸進的模糊,而不是均勻的,這個圖明顯是均勻的;

據說最新的華為手機效果不錯,具體本人沒有找到相應的測試,有興趣的可以試一下;

這裡我們也給一個相對而言看起來比較真實一點的測試圖:



上面這兩張圖是XSHOT的原圖和效果圖,單看效果,圖3聚焦在一兩朵花上,也就是焦平面在花上,這個平面上是很清晰的,除此之外的地方,也是漸進模糊的,距離這朵花越遠的地方,模糊程度也越強。

對於雙攝像頭的背景虛化,實際上是利用兩個攝像頭的位置資訊,計算成像的景深等等,來結合演算法實現的效果;由於採用了兩個攝像頭,因此,效果要比單攝像頭單純的演算法實現要好,這裡給出

iphone7P的效果圖,該圖也來自網路:


上面我們詳細的說了一下背景虛化的特點,針對最後一點焦外二線性,實際上是這樣的:對於單反,絕大多數鏡頭在全開光圈的時候,光圈都是圓形的,此時的焦外成像就代表了鏡頭設計的本性;當收縮光圈拍攝時表現出來的焦外成像,是鏡頭設計的本性和光圈形狀共同作用的結果。一些鏡頭在全開光圈時可以表現出很好的焦外成像,但是在收縮光圈後,由於光圈的非圓形,會破壞焦外成像內容。

一般來說,好的虛化應該是按對焦點遠近過渡均勻連續的,在焦外成像中沒有明顯的邊緣殘留,如圖6所示;而圖5中,虛化的物體的輪廓不是均勻散焦的,而是被數條線分開,形成一些類似小氣泡的東西,這就是焦外二線性。


二,背景虛化演算法實現

這裡我所講的是單攝像頭情況下的演算法實現;

這個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,歡迎交流討論影象演算法!