圖像合成與圖像融合
這一次我來(lái)給大家介紹一下圖像合成與融合。
我們經(jīng)??吹揭恍┖芷婷畹腜S技術(shù),例如下面這張,它把1928年的一位叫做Frankie Yale的黑幫老大被殺時(shí)的照片,與現(xiàn)在這棟房子的照片無(wú)縫融合在一起:

還有這張,將1945年柏林街道的照片和2010年的照片無(wú)縫的融合到一起

給天空加上彩虹,這是咱們很多時(shí)候后期處理相片時(shí)常見(jiàn)的手段:

改變花朵的顏色

交換水果的紋理外觀:

還有更妙的,在1994年上映的阿甘正傳里面,湯姆漢克斯和肯尼迪總統(tǒng)同框出鏡,即使是在大熒幕上也是毫無(wú)違和感。
不得不說(shuō),圖像合成和融合真是一個(gè)很神奇的技術(shù)。因此我準(zhǔn)備用好幾篇文章對(duì)此做一些詳細(xì)的介紹。下圖是提綱,這一篇文章會(huì)介紹三個(gè)技術(shù):cut-and-paste, alpha blending, multiand blending

在所有相關(guān)技術(shù)中,最直觀簡(jiǎn)單就是cut-and-paste了,經(jīng)常在攝影師后期制作中所采用,如果使用得當(dāng),它也可以創(chuàng)作出令人滿意的效果。
例如,下面照片如何制作出來(lái)?

其實(shí)它是由兩張照片中不同的部分按一定順序疊加而成的,大家可以看看下面的源圖像:

只要我們先放上左圖的背景,再疊加比爾蓋茨的人像,最后再疊加左圖的前景,就可以合成出最終的圖像。
從圖像中確定前景和背景的技術(shù)叫做摳圖,英文對(duì)應(yīng):Image Matting,而將摳出的部分無(wú)縫的貼入目標(biāo)圖像的過(guò)程則稱為圖像合成,英文對(duì)應(yīng):Image Compositing. 為了技術(shù)術(shù)語(yǔ)的準(zhǔn)確性,我這里引用《Computer Vision: Algorithms and Applications》的原文如下:
The process of extracting the object from the original image is often called matting (Smith and Blinn 1996), while the process of inserting it into another image (without visible artifacts) is called compositing (Porter and Duff 1984; Blinn 1994a).
Cut-and-paste技術(shù)如果應(yīng)用得當(dāng),可以產(chǎn)生相當(dāng)有藝術(shù)感的圖像,如下圖,這應(yīng)該是在原始的人物和狗狗身上粘貼了很多紋理圖像形成的。

但很多時(shí)候,這個(gè)簡(jiǎn)單的技術(shù)只會(huì)產(chǎn)生讓人沮喪的結(jié)果,例如下面的圖像中想要粘貼進(jìn)去兩只企鵝,就真的是5毛錢的特效了。

既然剪切粘貼過(guò)于粗暴,生成的照片不夠自然,有沒(méi)有更好的方法呢?接下來(lái)我們就談?wù)勔环N更好的方法:Alpha Blending
Alpha融合是一個(gè)升級(jí)版的cut-and-paste,如果表示為公式的話是這個(gè)樣子:
output = foreground * mask + background * (1-mask)

由于上面使用的Mask是二值的,因此融合的圖像很不自然,大家從融合生成的圖像也可以看出

如果對(duì)Mask圖做稍稍的羽化,效果就會(huì)好很多,見(jiàn)下圖。對(duì)Mask圖做羽化的方法有很多,最直接的方法就是對(duì)其做一定尺度的高斯濾波,我在基本圖像濾波中已經(jīng)講過(guò)了。

因此Alpha融合的效果好壞取決我們?nèi)绾握_的設(shè)置Alpha Mask,如果要把一張圖中的一部分摳出,并融合到另外一張新的圖片中,主要牽涉到兩個(gè)步驟:
準(zhǔn)確的摳圖獲取Alpha Mask
對(duì)Alpha Mask做合適的羽化,使得融合更自然
準(zhǔn)確的計(jì)算Alpha Mask很多時(shí)候都是一件復(fù)雜的事情,我們下面看一個(gè)稍微復(fù)雜的例子。有時(shí)候我們希望將兩張照片重疊到一起生成一張照片,例如下面兩張照片:

怎么融合它們呢?有很多人想出了一些聰明的方法?,F(xiàn)在介紹一種:
第1步:生成兩張圖像的distance transform圖

這個(gè)distance tranform圖中的每個(gè)像素值都表示原圖中對(duì)應(yīng)的像素與其最近的黑色像素(zero pixels)的距離。如果你使用OpenCV的話,可以用distanceTransform函數(shù)來(lái)做到,如果是Matlab,則是bwdist函數(shù)。
第2步:計(jì)算Mask

接下來(lái)采用Alpha融合方式,可以得到最終的照片如下。你可以看到兩張照片已經(jīng)比較好的融合到了一起,當(dāng)然還可以看出一些細(xì)微的不自然處。

要想讓Alpha融合結(jié)果顯得自然,很關(guān)鍵的一點(diǎn)是選擇合適的融合窗口大小。我用下面的實(shí)例來(lái)說(shuō)明這個(gè)問(wèn)題。
讓我們把以下兩張照片融合到一起。

如果選擇圖像中中軸線作為融合后兩個(gè)圖像的分界線,那么融合過(guò)程可以表示為:

這其實(shí)也是一種Alpha融合,實(shí)際上上面的過(guò)程就是:
leftImageWeight * leftImage + rightImageWeight * rightImage = OutputImage
其中:
leftImageWeight + rightImageWeight = 1
因此最終圖像的表現(xiàn)取決于兩張圖片的有效像素的重疊區(qū)域。那么問(wèn)題來(lái)了,這個(gè)重疊區(qū)域到底選擇多大呢?我以下圖來(lái)說(shuō)明不同窗口大小的影響:

有一個(gè)經(jīng)驗(yàn)判斷準(zhǔn)則是:
融合窗口大小要相當(dāng)于輸出圖像中最大的顯著特征的大小,從頻譜上看生成的圖像所包含頻率個(gè)數(shù)應(yīng)該是2的冪
融合窗口大小要小于2倍最小顯著特征的大小,從輸出圖像的頻譜上看最大頻率<=2*最小頻率
然而大家都知道,自然圖像通常包含了很多不同的特征,頻譜跨度也很大,此時(shí)選擇融合窗口就會(huì)非常困難,有沒(méi)有更好的方法呢?這就引入了一種新的融合方法:多頻段融合。下圖說(shuō)明了這個(gè)思想:

因此總結(jié)其流程就是:
對(duì)要融合的兩張照片,構(gòu)建拉普拉斯金字塔
對(duì)金字塔的每一層,應(yīng)用以下公式進(jìn)行融合

3. 利用融合后的金字塔重建出輸出圖像
我們來(lái)看一個(gè)著名的例子,一個(gè)蘋果和一個(gè)橘子如何通過(guò)中線融合到一起

利用上面的流程,我們來(lái)看看金字塔各層融合的情況:

OK,因此如果重建出原始圖像可以看到,我們這里講的多頻段融合,即拉普拉斯金字塔融合,實(shí)際上是在半自動(dòng)的計(jì)算最佳的融合窗口和權(quán)重大小,其本質(zhì)上還是一種線性融合:

在《Computer Vision: Algorithms and Applications》一書(shū)中還有很多有趣的例子,例如:

在實(shí)際實(shí)現(xiàn)過(guò)程中,為了節(jié)省計(jì)算量,可以考慮只用兩層金字塔來(lái)融合:

這在需要融合多張圖像時(shí)非常有用,例如下面我們需要將多張照片融合成一幅全景圖像:

這里我只是簡(jiǎn)單的把多張經(jīng)過(guò)裁剪的照片擺放在一起,還沒(méi)有經(jīng)過(guò)融合。
如果進(jìn)行了兩層金字塔融合,我們可以分別對(duì)低頻信號(hào)和高頻信號(hào)進(jìn)行融合,所得到的圖像如下:

從這兩層圖像我們可以重建出最終的圖像:

由于兩層金字塔融合,甚至多層金字塔融合同時(shí)考慮到了圖像中的不同頻率的信息,因此通常融合出來(lái)的效果相比單層的Alpha融合(線性融合)更好。就以上面的融合圖像來(lái)比較一下圖像的局部,大家可以看到金字塔融合的內(nèi)容更清晰:

我們?cè)谝婚_(kāi)篇看到了很多圖像融合的實(shí)例,我希望它們已經(jīng)成功的吸引了你的注意。而今天給大家介紹了圖像合成和融合的幾個(gè)基本的方法,包括cut-and-paste,alpha融合,以及多頻段融合。它們基本上都可以歸納為圖像之間的線性融合,其中多頻段融合是一種多層的線性融合。我下一講將要講到一種效果非常好的融合方式:泊松融合。

我在如下的Jupyter Notebook中展示了本帖中的相關(guān)操作,你可以對(duì)著它獲取更深入的理解,也能夠進(jìn)一步掌握用Python來(lái)進(jìn)行圖像處理的一些技巧。
nbviewer.jupyter.org/gi
跟這一系列專題文章相關(guān)的Notebook可以從github.com/yourwanghao/獲取
參考資料:
這一篇文章的絕大部分素材來(lái)自于
[1] CMU 2017 Fall Computational Photography Course 15-463, Lecture 7
[2] Richard Szeliski, Computer Vision : Algorithms and Applications
交流群
歡迎加入公眾號(hào)讀者群一起和同行交流,目前有SLAM、三維視覺(jué)、傳感器、自動(dòng)駕駛、計(jì)算攝影、檢測(cè)、分割、識(shí)別、醫(yī)學(xué)影像、GAN、算法競(jìng)賽等微信群(以后會(huì)逐漸細(xì)分),請(qǐng)掃描下面微信號(hào)加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺(jué)SLAM“。請(qǐng)按照格式備注,否則不予通過(guò)。添加成功后會(huì)根據(jù)研究方向邀請(qǐng)進(jìn)入相關(guān)微信群。請(qǐng)勿在群內(nèi)發(fā)送廣告,否則會(huì)請(qǐng)出群,謝謝理解~
