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 的速度可能是記憶體幾十甚至上百倍。
^
|
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沒想到可以做類似的處理。當然還是要看效果再說有沒必要。以前做去霧算法時不平滑相臨幀的參數時效果上會閃爍得很厲害。