如何通過多幀影像進(jìn)行超分辨率重構(gòu)?

姓名:于川皓 學(xué)號(hào):16140210089

轉(zhuǎn)載自:https://www.zhihu.com/question/25401250

【嵌牛導(dǎo)讀】:通過一系列低分辨率的圖像以特定算法得到一幅較高分辨率的圖像,有著廣泛的應(yīng)用。

【嵌牛鼻子】:超分辨率重構(gòu)

【嵌牛提問】:多幀影像圖片超分辨率重建的實(shí)現(xiàn)方法是什么?

【嵌牛正文】:

取出幾幀示意如下:因?yàn)槭侄叮⑶蚁鄼C(jī)分辨率低,已經(jīng)沒了樣。其實(shí)上面是我先把原圖的圖像隨機(jī)平移,然后線性插值降采樣到8x8分辨率得到的。在這個(gè)過程中我模擬了兩件事:1) 隨機(jī)平移模擬視頻拍攝過程中的隨機(jī)抖動(dòng),這是從多幀圖像中重建超分辨率圖像的關(guān)鍵,后面我會(huì)講到,同時(shí)這也是符合現(xiàn)實(shí)生活規(guī)律的,雖然宏觀來說拍攝一段靜止的視頻很容易,可是在像素級(jí)別任何微小的畫面移動(dòng)都可以被體現(xiàn)出來。2) 線性插值降采樣模擬在CMOS上成像時(shí)圖像元素小于像素時(shí)細(xì)節(jié)的丟失,線性插值是因?yàn)橄袼赜涗浀闹凳窃谙袼卦行Ц泄饷娣e上的平均曝光強(qiáng)度。這兩個(gè)過程的示意圖如下:首先看第一個(gè)圖中兩個(gè)圓的例子,這兩個(gè)圓大小完全一樣,因?yàn)槌上裎恢貌煌?,圓在每個(gè)像素上覆蓋的面積也不一樣,對(duì)應(yīng)像素的灰度會(huì)不一樣,最后在像素陣列上對(duì)應(yīng)了不同的圖案,而這個(gè)信息正是進(jìn)行超分辨率重建的基礎(chǔ)。同樣的對(duì)于寫下的屌字,在不同的抖動(dòng)位置上,也會(huì)得到不一樣的低分辨率圖案。所以問題可以描述為,一幅高分辨率的圖像I_{H},經(jīng)過n次某種變換\[{{I}_{L}}=F\left( {{I}_{H}} \right)\]后得到了n幅低分辨率圖像,其中第i幅圖像為I_{L,i}。而具體到視頻錄制中,"某種變換"就是每次拍攝每一幀的時(shí)候記錄圖像的過程,具體到這個(gè)例子中F()就是手抖導(dǎo)致的圖像平移和線性插值的降采樣。所以本質(zhì)上來講從多幀低分辨率圖像中進(jìn)行超分辨率重建是個(gè)Inference的問題,高分辨率圖像中的細(xì)節(jié)信息在錄制成低分辨率幀的時(shí)候?qū)е铝藖G失,然而抖動(dòng)帶來的位移相當(dāng)于給了多一個(gè)維度的信息讓我們可以通過算法對(duì)信息進(jìn)行恢復(fù),從某種意義上講抖動(dòng)保存了原來圖像的細(xì)節(jié)信息。抖動(dòng)有多重要呢,先來做一個(gè)簡(jiǎn)單的試驗(yàn),盡管采樣到的幀分辨率都低得可憐,可是我們?nèi)绻讯秳?dòng)的信息恢復(fù)出來,也就是把抖動(dòng)后的這些低分辨率圖片對(duì)齊,然后求一個(gè)平均,結(jié)果如下:這時(shí)候已經(jīng)可以勉強(qiáng)看出屌樣了。。進(jìn)一步的,我們想推斷出更高分辨率的圖像,一個(gè)很自然的想法就是對(duì)超分辨率圖像進(jìn)行猜測(cè),把猜測(cè)的圖像變換后的結(jié)果和錄制采樣到的結(jié)果進(jìn)行對(duì)比,然后把差異作為目標(biāo)函數(shù)進(jìn)行優(yōu)化:\[\min \sum\limits_{i=1}^{n}{\left| {{I}_{L,i}}-F\left( {{I}_{H,i}} \right) \right|}\]對(duì)于上面這個(gè)優(yōu)化問題,如果抖動(dòng)的范圍完美覆蓋了一個(gè)像素周期以內(nèi)的所有區(qū)域,并且每一幀都采樣到了這個(gè)區(qū)域內(nèi)的所有的點(diǎn)的話,那么理論上是可以恢復(fù)出高分辨率圖像的,然而通常情況并非如此,比方說我想把我例子中24幀8x8的視頻恢復(fù)成一幅48x48的高分辨率圖像,也就是6倍的分辨率提升,那么24幀顯然不夠,這種情況叫做ill-posed,也就是說有無數(shù)個(gè)解可以滿足這個(gè)優(yōu)化問題,所以需要一些regularization。通常而言我們看到的圖像一般都是較為平滑的,而不是像老式電視機(jī)里沒信號(hào)是那樣滿屏的雪花斑噪聲,所以可以加入一項(xiàng)抑制圖像梯度的項(xiàng):\[\min \sum\limits_{i=1}^{n}{\left| {{I}_{L,i}}-{{F}_{i}}\left( {{I}_{H}} \right) \right|}+\left| \nabla {{I}_{H}} \right|\]注意我這里用的都是L1 Norm,一般來說L1的優(yōu)點(diǎn)是使梯度的分布更為稀疏,這樣能更好的保存邊緣,另外計(jì)算量也小。用遺傳算法來解這個(gè)優(yōu)化問題試試,得到結(jié)果如下:0代:10代20代50代100代200代500代1000代2000代20000代進(jìn)化過程動(dòng)圖的鏈接: http://images.cnitblog.com/blog/609274/201411/181506083165247.gif 因?yàn)槭荊A,所以看上去還是有一點(diǎn)瑕疵,不過屌樣已經(jīng)很明顯了,如果繼續(xù)優(yōu)化應(yīng)該能得到完美的結(jié)果。當(dāng)然了,如前所述,我只是用一個(gè)玩具例子講一下超分辨率重構(gòu)的基本思想,具體的問題中,除了抖動(dòng)和低分辨率采樣,還有鏡頭PSF(Point Spread Function),圖像的轉(zhuǎn)動(dòng)和其他形變,場(chǎng)景中的物體移動(dòng)等因素,優(yōu)化算法也不會(huì)是GA這種相比起來漫無目的的搜索(雖然我還修改了變異和交叉函數(shù))。另外降采樣我這里用的是線性插值,這包含一個(gè)假設(shè),就是每個(gè)像素的感光元件的有效感光面積接近這個(gè)元件在傳感器表面占用的面積,而這個(gè)假設(shè)通常是很難成立的,尤其是對(duì)現(xiàn)在消費(fèi)級(jí)相機(jī)和手機(jī)中流行的CMOS,還有一種常見的降采樣是點(diǎn)采樣,這個(gè)就比線性采樣相對(duì)而言簡(jiǎn)單一些,然而這個(gè)通常也不成立,并且一般應(yīng)用的消費(fèi)級(jí)CMOS還要考慮Bayer陣列的問題。至于樓主問到PS能否實(shí)現(xiàn),據(jù)我所知應(yīng)該沒有。不過OpenCV里做這件事已經(jīng)非常簡(jiǎn)單了,一個(gè)簡(jiǎn)化版的代碼如下:cv::Ptrframes = cv::superres::createFrameSource_Video( "diao.mp4" );cv::Ptrsuper_res = cv::superres::createSuperResolution_BTVL1();

super_res->setInput( frames );

cv::Mat super_resolved_image;

super_res->nextFrame( super_resolved_image );

cv::imshow( "Super Resolved Image", super_resolved_image );

cv::waitKey( 0 );

我用我的高級(jí)智能手機(jī)拍了一段長(zhǎng)達(dá)2秒的176x144分辨率的視頻測(cè)試了一下這段代碼:

視頻截圖(為方便比較用Nearest Neighbor放大到和重建圖像等同分辨率):

重建的超分辨率圖像:

效果還行。通常情況下超分辨率重建運(yùn)算量還是比較大的,所以實(shí)際情況代碼不會(huì)這么簡(jiǎn)單,一個(gè)用到GPU的基于OpenCV的例子可以在OpenCV的sample code里找到。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容