姓名:于川皓 學(xué)號(hào):16140210089
轉(zhuǎn)載自:https://www.zhihu.com/question/25401250
【嵌牛導(dǎo)讀】:通過(guò)一系列低分辨率的圖像以特定算法得到一幅較高分辨率的圖像灌侣,有著廣泛的應(yīng)用。
【嵌牛鼻子】:超分辨率重構(gòu)
【嵌牛提問(wèn)】:多幀影像圖片超分辨率重建的實(shí)現(xiàn)方法是什么?
【嵌牛正文】:
取出幾幀示意如下:因?yàn)槭侄墩海⑶蚁鄼C(jī)分辨率低愧薛,已經(jīng)沒(méi)了樣晨炕。其實(shí)上面是我先把原圖的圖像隨機(jī)平移,然后線性插值降采樣到8x8分辨率得到的毫炉。在這個(gè)過(guò)程中我模擬了兩件事:1) 隨機(jī)平移模擬視頻拍攝過(guò)程中的隨機(jī)抖動(dòng)瓮栗,這是從多幀圖像中重建超分辨率圖像的關(guān)鍵,后面我會(huì)講到碘箍,同時(shí)這也是符合現(xiàn)實(shí)生活規(guī)律的遵馆,雖然宏觀來(lái)說(shuō)拍攝一段靜止的視頻很容易,可是在像素級(jí)別任何微小的畫面移動(dòng)都可以被體現(xiàn)出來(lái)丰榴。2) 線性插值降采樣模擬在CMOS上成像時(shí)圖像元素小于像素時(shí)細(xì)節(jié)的丟失货邓,線性插值是因?yàn)橄袼赜涗浀闹凳窃谙袼卦行Ц泄饷娣e上的平均曝光強(qiáng)度。這兩個(gè)過(guò)程的示意圖如下:首先看第一個(gè)圖中兩個(gè)圓的例子四濒,這兩個(gè)圓大小完全一樣换况,因?yàn)槌上裎恢貌煌瑘A在每個(gè)像素上覆蓋的面積也不一樣盗蟆,對(duì)應(yīng)像素的灰度會(huì)不一樣戈二,最后在像素陣列上對(duì)應(yīng)了不同的圖案,而這個(gè)信息正是進(jìn)行超分辨率重建的基礎(chǔ)喳资。同樣的對(duì)于寫下的屌字觉吭,在不同的抖動(dòng)位置上,也會(huì)得到不一樣的低分辨率圖案仆邓。所以問(wèn)題可以描述為鲜滩,一幅高分辨率的圖像I_{H},經(jīng)過(guò)n次某種變換\[{{I}_{L}}=F\left( {{I}_{H}} \right)\]后得到了n幅低分辨率圖像节值,其中第i幅圖像為I_{L,i}徙硅。而具體到視頻錄制中,"某種變換"就是每次拍攝每一幀的時(shí)候記錄圖像的過(guò)程搞疗,具體到這個(gè)例子中F()就是手抖導(dǎo)致的圖像平移和線性插值的降采樣嗓蘑。所以本質(zhì)上來(lái)講從多幀低分辨率圖像中進(jìn)行超分辨率重建是個(gè)Inference的問(wèn)題,高分辨率圖像中的細(xì)節(jié)信息在錄制成低分辨率幀的時(shí)候?qū)е铝藖G失,然而抖動(dòng)帶來(lái)的位移相當(dāng)于給了多一個(gè)維度的信息讓我們可以通過(guò)算法對(duì)信息進(jìn)行恢復(fù)桩皿,從某種意義上講抖動(dòng)保存了原來(lái)圖像的細(xì)節(jié)信息豌汇。抖動(dòng)有多重要呢,先來(lái)做一個(gè)簡(jiǎn)單的試驗(yàn)业簿,盡管采樣到的幀分辨率都低得可憐瘤礁,可是我們?nèi)绻讯秳?dòng)的信息恢復(fù)出來(lái),也就是把抖動(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)化問(wèn)題,如果抖動(dòng)的范圍完美覆蓋了一個(gè)像素周期以內(nèi)的所有區(qū)域钝腺,并且每一幀都采樣到了這個(gè)區(qū)域內(nèi)的所有的點(diǎn)的話抛姑,那么理論上是可以恢復(fù)出高分辨率圖像的,然而通常情況并非如此艳狐,比方說(shuō)我想把我例子中24幀8x8的視頻恢復(fù)成一幅48x48的高分辨率圖像定硝,也就是6倍的分辨率提升,那么24幀顯然不夠毫目,這種情況叫做ill-posed蔬啡,也就是說(shuō)有無(wú)數(shù)個(gè)解可以滿足這個(gè)優(yōu)化問(wèn)題,所以需要一些regularization镀虐。通常而言我們看到的圖像一般都是較為平滑的箱蟆,而不是像老式電視機(jī)里沒(méi)信號(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刮便,一般來(lái)說(shuō)L1的優(yōu)點(diǎn)是使梯度的分布更為稀疏空猜,這樣能更好的保存邊緣,另外計(jì)算量也小恨旱。用遺傳算法來(lái)解這個(gè)優(yōu)化問(wèn)題試試抄肖,得到結(jié)果如下:0代:10代20代50代100代200代500代1000代2000代20000代進(jìn)化過(guò)程動(dòng)圖的鏈接: http://images.cnitblog.com/blog/609274/201411/181506083165247.gif 因?yàn)槭荊A,所以看上去還是有一點(diǎn)瑕疵窖杀,不過(guò)屌樣已經(jīng)很明顯了,如果繼續(xù)優(yōu)化應(yīng)該能得到完美的結(jié)果裙士。當(dāng)然了入客,如前所述,我只是用一個(gè)玩具例子講一下超分辨率重構(gòu)的基本思想,具體的問(wèn)題中桌硫,除了抖動(dòng)和低分辨率采樣夭咬,還有鏡頭PSF(Point Spread Function),圖像的轉(zhuǎn)動(dòng)和其他形變铆隘,場(chǎng)景中的物體移動(dòng)等因素卓舵,優(yōu)化算法也不會(huì)是GA這種相比起來(lái)漫無(wú)目的的搜索(雖然我還修改了變異和交叉函數(shù))。另外降采樣我這里用的是線性插值膀钠,這包含一個(gè)假設(shè)掏湾,就是每個(gè)像素的感光元件的有效感光面積接近這個(gè)元件在傳感器表面占用的面積,而這個(gè)假設(shè)通常是很難成立的肿嘲,尤其是對(duì)現(xiàn)在消費(fèi)級(jí)相機(jī)和手機(jī)中流行的CMOS融击,還有一種常見(jiàn)的降采樣是點(diǎn)采樣,這個(gè)就比線性采樣相對(duì)而言簡(jiǎn)單一些雳窟,然而這個(gè)通常也不成立尊浪,并且一般應(yīng)用的消費(fèi)級(jí)CMOS還要考慮Bayer陣列的問(wèn)題。至于樓主問(wèn)到PS能否實(shí)現(xiàn)封救,據(jù)我所知應(yīng)該沒(méi)有拇涤。不過(guò)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里找到搓彻。