图像超分辨率

又是一篇简单的记录。图像超分辨率大致分为以下几类:单张LR->单张HR,这类基本依靠先验或者训练学习,实际运用上等同于猜。多张LR->多张HR,基本上是视频的超分辨率,多张LR->单张HR,这种就是典型的堆栈超分。堆栈超分是建立在亚像素配准和多帧融合的策略上,通过多帧图像采集不同的相位。亚像素配准又可以使用块匹配、光流、sift,融合策略五花八门,Google HDR做了不少这方面的工作,单帧超分的RAISR、多帧超分的Handheld Multi-frame SR等,可多多研究。

Raisr是典型的单帧超分,其将图像分成很多11×11的图像块进行训练,映射到特征空间(梯度、强度、相似度),生成离散特征空间的卷积核。在超分时,在11×11的图像块上,计算特征,映射的特征空间查找卷积核,对其进行超分。

多帧超分,可以通过sift特征匹配、光流、金字塔块匹配等计算亚像素,然后在亚像素水平上插值,做mask,然后stacking,进行多帧超分。

Hand-held Multi-frame super resolution实现记录

大致实现了Google Research 2019 paper中的内容,简单记录下。多帧超分的第一步是对齐,块匹配+光流的方式进行图像对齐,要求图像不能有太大的明暗变化。金字塔块匹配用了4层金字塔,块的大小用了16 32 和 64,这个根据噪声水平来选取。每一层的搜索范围设置了2pixel,没有设太大(感觉也可以把金字塔层数设成2层,把搜索范围改大)。光流用LK光流迭代就可以,要带上块匹配时候的初始值。

Motion Robustness计算的时候需要用到噪声模型,有些DNG图像里面存了噪声模型,直接拿来用就可以  N=SI+O 就是噪声方差,作为论文中的sigma_md,然后根据这个噪声方差来仿真得到dist_md。同时还可以根据噪声方差计算得到图像的SNR。

SNR=10log(I2/(SI+O))。

在motion robustness计算里面还有一个高频拒绝要注意,对于一些实验室场景,可能出现密集的空间高频,这个时候就需要把高频区给找到(找的方法就是通过一个低通滤波器,然后看方差变化了多大),这些区域在最后stacking的时候不做融合。

Kernel Reconstruction实现的时候细节比较多,比如要根据snr做线性分段来选参数,算特征值的时候,如果要参数能和论文对上,就要把图像归一化到[0,1],公式里面的 I 也是要区域求和的,不过最后实现出来有点儿问题,直接在RAW上做有很多artifacts,后来没有解决,并且跳出来kernel的形状感觉不太对。

简单写了一个Python的,Python运行实在太慢了,没写完,转投matlab搞,这个python的里面gamma之类的都没调,大致放个框架吧,这个里面还没有超分,要做超分的话增加采样频率就可以,这个里面robust mask没有算,也没有金字塔光流,只有一个简单的lk,姑且参考:

 

谢谢!

留下评论