徐志偉++黃偉峰++張海
摘要:數(shù)碼成像設(shè)備只能表示非常有限的動(dòng)態(tài)范圍,因此亮度差異很大的物體很難在一副圖像中清楚顯示。曝光融合就是將不同曝光條件下采集的圖像合并成一幅所有細(xì)節(jié)都清晰的圖像,而多分辨率曝光融合是其中一種簡單且高效的方法。該文闡述了該算法在安卓平臺(tái)上的設(shè)計(jì)和實(shí)現(xiàn)方法,并在手機(jī)上進(jìn)行測試,實(shí)驗(yàn)結(jié)果表明該算法能運(yùn)行在手機(jī)上,為以后測試更多曝光融合算法提供了一個(gè)平臺(tái)。
關(guān)鍵詞:多分辨率曝光融合;安卓平臺(tái);系統(tǒng)實(shí)現(xiàn)
中圖分類號:TP37 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2016)32-0262-02
1 背景
普通數(shù)碼相機(jī)或具有拍照功能的手機(jī)已成為人們記錄生活的主要工具。由于數(shù)碼成像設(shè)備能表示的動(dòng)態(tài)范圍遠(yuǎn)低于現(xiàn)實(shí)世界的動(dòng)態(tài)范圍,因此亮度差異很大的兩個(gè)對象難以在一幅圖像中清晰成像。曝光融合是通過圖像融合技術(shù),將多幅不同曝光條件下采集的圖像合成一幅更能反映現(xiàn)實(shí)景象,從而保證所有細(xì)節(jié)都比較清晰。這種算法簡化了中間過程,不需要生成高動(dòng)態(tài)范圍圖像,減少了相機(jī)響應(yīng)函數(shù)估計(jì)誤差對合成結(jié)果的影響,其中最具代表性的是多分辨率曝光融合算法[1]。
該算法由T. Mertens、J. Kautz和F. V. Reeth共同提出,其主要思想是:首先,根據(jù)對比度、飽和度和曝光度,為原始輸入圖像計(jì)算權(quán)值矩陣;然后,對圖像進(jìn)行拉普拉斯分解,而對權(quán)值矩陣進(jìn)行高斯分解;最后,在對每一層的圖像分別融合后,將所有層的融合結(jié)果合并成一幅圖像。下面將介紹如何將該算法在安卓平臺(tái)上實(shí)現(xiàn)。
2 多分辨率曝光融合在安卓平臺(tái)上的實(shí)現(xiàn)
圖1 多分辨率曝光融合系統(tǒng)的UML圖
為了能在手機(jī)端運(yùn)行曝光融合算法,這個(gè)系統(tǒng)至少包括連拍和多分辨率曝光融合兩大功能。當(dāng)選擇連拍時(shí),能進(jìn)入拍照畫面,并且能拍出多張具有不同曝光度的照片;當(dāng)選擇曝光融合時(shí),能夠?qū)x定的多張圖片進(jìn)行融合并顯示出結(jié)果圖片。為了實(shí)現(xiàn)這些功能,我們設(shè)計(jì)的類及類間關(guān)系如圖1所示。
類MainActivity是該系統(tǒng)的第一個(gè)界面,主要包括連拍和融合2個(gè)按鈕,分別切換到拍照界面和融合界面。類CameraAty是拍照界面,不僅提供照片預(yù)覽功能,還能通過多次啟動(dòng)拍照并在每次啟動(dòng)前修改相機(jī)曝光值,達(dá)到采集具有不同曝光度的照片的效果。類rongheActivity是融合界面,用以顯示所有圖像,并提供選擇工具,一旦選中多幅圖像后通過開始融合按鈕,實(shí)現(xiàn)融合并顯示結(jié)果。
類imageMap和類weightMap用來實(shí)現(xiàn)彩色圖像和權(quán)值映射的基本操作,并在此基礎(chǔ)上,類mulResDecompo實(shí)現(xiàn)了多分辨率曝光融合算法,其中3個(gè)主要成員函數(shù)exposure_fusion、gaussian_pyramid和laplacian_pyramid分別實(shí)現(xiàn)了融合算法的主體、高斯分解和拉普拉斯分解。用Java語言描述多分辨率曝光融合算法主體如下所示:
public Bitmap exposure_fusion(List
int nlev = (int)(Math.floor(Math.log((double)(Math.min(bmps.get(0).getWidth(),bmps.get(0).getHeight()))) / Math.log((double)2)));//根據(jù)輸入圖像的長度和寬度,自動(dòng)計(jì)算圖像分解的層數(shù)
List
for(int i = 0; i < wms.size(); i++){
List
List
for(int j = 0; j < nlev; j++){//逐層融合,每層得到1幅結(jié)果圖像
if(i==0){
imageMap tmp = new imageMap();
tmp.setWidth(pyrB.get(j).getWidth());
tmp.setHeight(pyrB.get(j).getHeight());
tmp.setRed(new double[tmp.getWidth()*tmp.getHeight()]);
tmp.setGreen(new double[tmp.getWidth()*tmp.getHeight()]);
tmp.setBlue(new double[tmp.getWidth()*tmp.getHeight()]);
for(int x = 0; x < tmp.getWidth(); x++)
for(int y = 0; y < tmp.getHeight(); y++){
tmp.setARed(x, y, pyrB.get(j).getARed(x, y)* pyrW.get(j).getAWeight(x, y));
tmp.setAGreen(x, y, pyrB.get(j).getAGreen(x, y)* pyrW.get(j).getAWeight(x, y));
tmp.setABlue(x, y, pyrB.get(j).getABlue(x, y)* pyrW.get(j).getAWeight(x, y));
}
ans.add(tmp);
}
else
{
imageMap tmp = ans.get(j);
for(int x = 0; x < tmp.getWidth(); x++)
for(int y = 0; y < tmp.getHeight(); y++){
tmp.setARed(x, y, tmp.getARed(x, y)+pyrB.get(j).getARed(x, y)* pyrW.get(j).getAWeight(x, y));
tmp.setAGreen(x, y, tmp.getAGreen(x, y)+pyrB.get(j).getAGreen(x, y)* pyrW.get(j).getAWeight(x, y));
tmp.setABlue(x, y, tmp.getABlue(x, y)+pyrB.get(j).getABlue(x, y)* pyrW.get(j).getAWeight(x, y));
}
}
}
}
return reconstruct_laplacian_pyramid(ans);//將nlev幅結(jié)果圖像合并成一幅輸出
}
該算法的輸入是原始彩色圖像和權(quán)值矩陣,其中權(quán)值矩陣根據(jù)對比度、飽和度和曝光度計(jì)算得到[1],而輸出則是融合后的結(jié)果圖像。算法的主要過程是:
1)根據(jù)圖像的長度和寬度,自動(dòng)計(jì)算出圖像分解的層數(shù)nlev;
2)gaussian_pyramid(weightMap a,int nlev)將權(quán)值矩陣分解為nlev層的高斯金字塔;
3)laplacian_pyramid(imageMap a,int nlev)將圖像分解為nlev層的拉普拉斯金字塔;
4)將同一層的所有圖像根據(jù)權(quán)值矩陣加權(quán)平均,得到nlev層結(jié)果圖像;
5)reconstruct_laplacian_pyramid(List
3 實(shí)現(xiàn)效果
程序運(yùn)行后,單擊拍照按鈕,拍出3張曝光度不同的照片,并在單擊圖像融合后,能夠?qū)x定的3張圖像進(jìn)行融合處理,并得出最終的圖像。圖2顯示了一組實(shí)驗(yàn)結(jié)果,其中第一行3幅圖是待融合的輸入圖像,第二行是融合圖像。實(shí)驗(yàn)效果表明該系統(tǒng)已實(shí)現(xiàn)算法的基本功能。此外,允許用戶設(shè)置采集圖像的數(shù)量,選出其中包含信息較多的圖進(jìn)行融合,就可以得到一張保留場景信息最多最好的圖像。
圖2 融合測試結(jié)果
4 結(jié)束語
本論文做了一種嘗試,將多分辨率曝光融合算法在安卓平臺(tái)上進(jìn)行實(shí)現(xiàn)并測試通過,為以后測試更多曝光融合算法提供了一個(gè)平臺(tái)。通過系統(tǒng)測試,我們也發(fā)現(xiàn)一些問題可以改進(jìn):
1)連拍需要一段時(shí)間才能完成,這段時(shí)間內(nèi)相機(jī)即使有輕微抖動(dòng),融合后的圖像也會(huì)呈現(xiàn)出重影。因?yàn)槎喾直媛势毓馊诤纤惴ㄖ粚o態(tài)場景有效,所以可以嘗試動(dòng)態(tài)場景的融合算法。
2)因?yàn)樵撓到y(tǒng)會(huì)產(chǎn)生一個(gè)圖像序列和一個(gè)權(quán)值矩陣序列,所以運(yùn)行時(shí)將耗費(fèi)大量的內(nèi)存,我們之后將進(jìn)一步改進(jìn)算法,盡量減少內(nèi)存消耗。
參考文獻(xiàn):
[1] Mertens T. Exposure Fusion: A Simple and Practical Alternative to High Dynamic Range Photography[J]. COMPUTER GRAPHICS forum, 2009, 28(1):161-171.
[2] 李剛. 瘋狂的Android講義[M]. 2版.北京: 電子工業(yè)出版社, 2012.
[3] 黃雋實(shí). Android開發(fā)最佳實(shí)踐[M]. 北京: 機(jī)械工業(yè)出版社, 2013.