天天看点

RAISR 静态图片超采样算法的理解RAISR(Rapid and Accurate Super Image Resolution)

RAISR(Rapid and Accurate Super Image Resolution)

这个算法看了一些介绍 大概理解 了,觉得比较有意思 ,在此记录一下:

思想是先通过双线性插值 放大2倍, 放大2倍的图像里 每个点 根据矩形 周围 [-5, 5] 范围内的梯度特征 作文章, 梯度特征可以版角度 angle, 强度 strength , 相关性coherence 三个参数,

训练阶段 不同角度 、强度、相关性 的组合 训练 不同的卷积核。

还原阶段先求梯度特征,再找到对应的卷积核 ,卷积运算还原。

注 : 此算法测下来与 espcn 速度和质量上都有很大差距。

以下是 检测算法的步骤:

一 假定 2 x 2 放大场景,预训练模型

一个点放大到 2x2 产生4个位置, 每个位置为中心生成一个11x11 的块,计算这个块内 由梯度生成的三个特征:  角度(归一化24份),强度(归一化3份),相关性(归一化3份)。

这样 根据特征: 分成 24 x 3 x 3  x 4 个桶, 每个桶 用神经网络 训练 一个 11 x 11 的卷积核。

二 超分算法

2.1  提取图像YPbPr 中 Y 分量作为处理的输入

这个好理解,人眼通常对亮度比较敏感,很多算法只处理Y

以下是每个点逐个处理:

2.2 每个点提取水平,垂直周围 [-5,5] 的 11x11 矩形区域 作为特征提取输入, 跟训练时一样。

2.3 先计算 11x11 mat 的 水平梯度和垂直梯度

    工程细节上有些个人的见解:

    A 梯度矩阵 gx/gy 可以分别用一个 11x11 的矩阵循环使用, 比如每向右移动一个像素 ,其实梯度矩阵就换了一列的数。

        每向下移动一列,梯度矩阵换了一行的数。

        以前的经验是,使用小的循环矩阵,每次扫描时重新计算一行一列梯度会比计算和存储一个大的梯度积分图还快, 

        原因是 积分图在大图像时不容易命中 cpu mem cache.  cpu cache 的速度可能是内存几十甚至上百倍。

RAISR 静态图片超采样算法的理解RAISR(Rapid and Accurate Super Image Resolution)

          ^

          |

  x,y右移时,这一列可用来存 x + r + 1 这一列的梯度 (r=2时)

   B 新的 gx1,gy1 是理论上 gx,gy 矩阵循环移动后的结果, 当成gx,gy 应该不影响最后的计算,下面再细说

2.4    gx,gy 均展开成1x121 的向量dx, dy , 再合到一起组成 2x121 的向量 G

G = 「dx

            dy 」

2.5  计算 矩阵 X = G * G.T 的特征向量和特征值

 计算公式忘记了, 这里继续说我的观点, 2.3 里得到 gx1, gy1 当成 gx,gy 的情况下计算出来的 X 结果是一致的

X = 「 gx1 *gx1.T ,         gx1 * gy1.T

             gy1 * gx1.T,         gy1 * gy1.T 」

X 的结果里每个值都是 gx1, gy1 两两4个组合对应元素乘积之和, 同样也等于 gx,gy 对应元素乘积之和

X 为 2x2 的矩阵, 得到特征向量 (fx, fy),  特征 值(r1, r2)

2.6 得到 角度 angle, 强度 strength, 一致性coherence 三个参数:

angle = arctan(fy, fx)   

strength =  max(r1, r2) / (r1 + r2)

conherence =  abs(sqrt(r1) - sqrt(r2) )/  abs(sqrt(r1) + sqrt(r2))

angle 和 strength, conherence 归一化到 (0~23), (0~3), (0~3)

以前弄过一个不要求精度的查找表的 arctan(dy,dx) 算法, 原理是 在 0~45度范围内 arctan 函数近似 线性, 当 dy 绝对值>dx时 就算 90度 - artan(dx, dy),  

最后 根据dx,dy 正负确定 象限来变换 > 90的情况。 复杂度 两组分支判断 + 一个除法, 比 math 函数 arctan 高不少。

这里分 24 份精度更没大问题。

2.7 从预训练模型里算出 卷积核的索引, 然后把目标图像位置换成与卷积核的 卷积

kernel = pretained_kernels[ angle * 9 + 3 * strength + conherence ] [ pos_idx ]

kernel 展成 121个元素的一维与 图像 patch 的 121 个元素两两乘积 再求和 -> 卷积

2.8 网上说这样处理完之后还要个做个 CT-Bleng算法来消除阴影

这个是否没必要? 有空再研究

最后有个问题, 很多对于视频的处理算法 都要做 "3D" 的处理, 相临帧之间要做个滤波来避免效果的跳变。 

RAISR没想到可以做类似的处理。当然还是要看效果再说有没必要。以前做去雾算法时不平滑相临帧的参数时效果上会闪烁得很厉害。

继续阅读