任務:在一個照片中將人和背景分離,然后將人放大,通過評估算法評估后放在圖中的合適位置,達到人放大而不影響整體效果。
任務分析:將照片中的人和背景分離應該會用到摳圖技術,將人物扣出來后,怎么處理圖片下的背景,想法是直接將附近的像素插值到圖片所占的背景下;
將人放大,暫時的想法是直接將人物圖像的像素所占的空間放大,可能會導致圖像模糊,后面再看看有什么方法放大人物而且能較好的保持清晰度;
將人物和背景融合,會用到圖像融合的知識,然后用評估算法評估融合后的圖像,圖像質量評價(參考原圖,還是無參考圖像質量評價)。
擬采取步驟:
1、查找合適的摳圖算法,將人物和背景分離。
2、找圖片放大的算法,將摳出的人像放大,人像盡量保持清晰。
3、找到合適的圖像融合算法,將人物和背景融合。
4、找到合適的圖像質量評估算法,評估融合圖像,達到人放大而不影響整體效果。
一、(1)剛開始的時候認為應該找摳圖算法,查了一些資料,比較經典的是貝葉斯摳圖(Bayesian Matting)。輸入一張圖片時,由貝葉斯摳圖算法得到的是α矩陣(矩陣元素的類型應該double,大小與trimp和原始圖像一致),然后再讀入一張新的背景圖片,並將前景(經由α矩陣)融合到新的背景中。α矩陣不是我們想要的前景圖片,很難對它做放大處理。先暫時放棄這個算法。
(2)感覺如果直接做圖像分割或許會更好些,找到一個可能不錯的算法,grab Cut圖像分割,因為只需要在目標外面畫一個框,把目標框起來,就可以完成良好的分割。雖然這個算法有些缺點,但是值得一試。
(3)由於grab Cut圖像分割大多數代碼都是基於OpenCV的,在電腦上配置OpenCV環境實在太麻煩了。還是嘗試先試一下貝葉斯摳圖,找到了matlab代碼,做了一些實驗,首先用作者提供的數據調試出了結果,跟預期的差不多。
但是有個問題,就是程序出了輸入源圖像之外,還必須輸入與之對應的Trimap圖(TriMap就是三元圖,它是和待分割圖像同等大小的一張圖,但圖中的像素只有三個取值,0、128和255)。然后再輸入背景圖片,將目標物與背景融合。我選擇純白色作為背景圖,這樣后面對目標物處理的時候就不會有什么不好的影響(不過話說回來,可不可以直接在原圖像上將目標物直接放大呢?算了,既然任務說的是先分離,那就一步一步來吧)。
然后我嘗試了從其他地方獲得圖片和對應的Trimap圖,程序可以正常運行,也就是說可以把目標物扣出來。這說明這個程序代碼還是沒什么問題的,但是找了不少資料都沒有發現怎么從圖像中獲得對應的Trimap圖。而最后的任務應該不會提供Trimap圖,如果用這個摳圖方法的話,必須解決這個問題。
經過幾天的搜索查閱,明白了一些東西,嘗試了一些方法。首先,Trimap圖應該是直接用photoshop畫出來的,所以我不打算采用這個方法,看了一些大牛的博客,我決定不用貝葉斯摳圖,雖然它最終也可以得到結果,但是還是感覺用ps畫圖挺麻煩的。找到了一個不錯關於摳圖的網站,網站上面有不少摳圖的論文、數據集和源代碼,甚至還有各種摳圖效果的評價。鏈接是 http://www.alphamatting.com/code.php
還找到了一篇不錯的論文《 A Closed Form Solution to Natural Image Matting 》,也是關於摳圖的,並且找到了作者的源代碼和數據集。不同的摳圖系統所接受的用戶輸入一般有兩種形式——trimap或scribbles。scribble的交互方式比trimap的方式要簡單,尤其當對於圖像前景輪廓比較復雜的時候。而這個摳圖算法采用的就是scribbles圖,只需要在原圖上畫上幾筆就可以了。根據作者的數據集實驗的結果如下:


除此之外,我做了一點小小的改動,可以直接把前景圖和背景圖分別保存下來。這樣就可以直接進行下一步的計划了。效果圖如下:


用作者的數據集實驗出來的效果顯然不錯,但是當我嘗試用其他數據集並且自己畫scribbles圖的時候,產生的結果就不太理想了。看了下論文,原來這個方法對 scribble 的位置很‘敏感’,不是隨便畫幾筆都能有很好的效果的。
果然,之前效果太差的原因還有我畫的scribbles圖有問題,試了好多次之后終於發現windows的畫圖工具的顏料板的顏色要一致,要么都是白色,要么都是黑色。下面是調整后產生的結果:

嗯,看起來還算不錯,雖然還沒弄清楚原理,但是至少這個任務目標的效果基本達到了,終於可以開始第二階段的任務了。
