super-night-hdr算法框架
super-night-hdr算法框架
一般拍摄14帧YUV(NV21图像,EV1<5帧>,EV0<5帧>,EV-2<2帧>,EV-4<2帧>),参考帧在EV1和EV0中选择,所以要计算清晰度;选择好参考帧后进行多帧降噪融合(与参考帧同EV的帧),然后融合EV负的帧以压制高光部分,最后做色阶拉伸、单帧降噪、增强(opencv-clahe)、锐化处理输出合成图像。其中可以增加去鬼影处理,但是对应算法较为复杂且有效性待验证。
1. 清晰帧选取
前10帧计算清晰度,选择基础参考帧;计算清晰度方法如下:
1)拉普拉斯(或者归一化)
2)能量法
a. 计算完清晰度进行排序,分别筛出EV1和EV0曝光值下的清晰度顺序帧号(使用opencv中的sortIdx获取清晰度值对应的图像索引)。
b. 排在最前面的清晰帧序号判断是属于哪个EV,由此选择对应EV下的帧作为MFNR图像组,同时选择其中最清晰的几帧或全部(设定阈值判断),同时确定其
中最清晰的帧序号,作为参考帧序号。
2. 多帧降噪(MFNR)
算法流程:光流跟踪获得运动向量场 ---》{配准,噪声估计} ---》去鬼影融合
光流跟踪获得运动向量场:
选择参考帧,对所有图像转灰度同时做s倍下采样以提高处理速度;
对参考帧生成角点,然后LK光流跟踪生成待处理帧的角点;(每次都会使用参考帧的角点,利用临时vector变量assign原始参考帧的角点信息)
筛选角点同时将得到的优质角点信息放大s倍;(回到原图对应位置?)
创建运动向量矩阵mv(双通道整型,保存dx、dy),大小与下采样的图像相同;参考帧该运动向量矩阵应全为0;
利用参考帧角点和待处理帧角点通过函数findHomography计算单应变换矩阵H(3x3);
计算每个位置的运动向量mv(x0,y0),设原位置x0、y0,新的位置x,y,double inv = 1.0/(H[6]*x0+H[7]*y0+H[8]*1);
x = (H[0]*x0+H[1]*y0+H[2]*1)*inv,y = (H[3]*x0+H[4]*y0+H[5]*1)*inv,mv(x0,y0) = (x0-x, y0-y),其中 x0-x 和 y0-y 如果大于0加0.5,
小于0减0.5,最后四舍五入取整;
用vector保存每帧对应的mv。
图像扩充边缘:为了块匹配,将图像分块,可能还需要块与块之间存在重叠(防止出现方块?)。
配准:
建立金字塔,分层块匹配,先在最小层做匹配,计算块的步长和数量;
运动向量resize到对应块的数量大小(每块对应一个位移值),同时放大到金字塔该层下采样时的倍率(一般为2);
选择最合适的位移(计算出一个块对应的四种位移《上下左右》?),通过待处理块与参考帧块的差值绝对值的和的大小来判断匹配的程度,在
每个位移处均在搜索半径±1的范围内搜索块计算差值绝对值和,选择较小的值对应的位移值,直到把所有的可能位移遍历完成;
如此循环计算每个块对应的最佳位移,然后把这个位移更新到上一层再继续计算直到所有层计算完成,得到最佳位移矩阵;
余下待配准的帧重复上述过程,得到各自的最佳位移矩阵;
噪声估计:
创建关于块的运动向量矩阵bmv,大小为分块后的尺寸(横向块数、纵向块数);如果参考帧是第一帧,那么选择选择参考帧的后一帧,
否则选择前一帧;
将对应的运动向量mv放大对应的下采样倍数s,然后resize到块的运动向量矩阵bmv;
设其是线性变化的,噪声斜率noiseSlope=1.0,噪声偏移noiseBias=0,噪声偏差比例noiseSigmaPercent=0.15;
利用bmv对待处理帧块配准,每块对应一个位移值,取对应快加位移后拷贝到新的图中;
块配准后的图与参考图做差的绝对值absval,resize到较小尺寸提高处理速度;
先对列降序排序再对行降序排序,取noiseSigmaPercent的尺寸对应的位置对应的值作为阈值th1;
设另一个值为th2 = 2*th1(也可以是其它倍数),这是来自其它帧与参考帧的差异(多帧降噪就是要计算不同帧的叠加权重),
th2变大,意味着叠加到参考帧的权重降低甚至为负值,意味着叠加值(类似于噪声)减小;假设由th1变为th2是增大的,叠加噪声值(就是absval)的
相对权重就要减小,设th1对应叠加噪声相对值为1,th2对应叠加噪声相对值为0,则有 dw(类似于权重相对变化) = -1 = k*(th2 - th1),
k = noiseSlope = 1.0/(th1 - th2),b = noiseBias = th2/(th2 - th1);
去鬼影融合:
计算每个块对应的权重,先初始化权重为1,然后根据块与块的重叠大小(如块的宽w、h均为64,横向和纵向重叠区域大小均为8)计算在重叠区的
窗口权重初始值(为了边缘过渡处理?非重叠区初始值均为wgtx = 1、wgty = 1),横向x<8,wgtx = x/(8-1),x>w-1-8,wgtx = (w-1-x)/(8-1),同理纵
向计算wgty如上,
wgt = wgtx * wgty,然后转定点计算需要移位;对于Y、U、V通道各自计算一套权重参数(U、V是一样的权重,块大小应该是Y的一半);
根据配准得到的块对应的位移矩阵取与参考块对应的待处理块(相当于对齐),两个块做差值绝对值后resize到宽高的一半(四合一),然后做高斯
滤波以消除异常色块或黑点?;接着将其convertTo到权重,乘噪声估计的斜率值noiseSlope,加噪声估计的偏移量noiseBias ;
权重与块相乘,遍历所有帧累加(就是所有帧对应位置权重与像素乘积的累加?),得到像素累加和psum与权重累加和wsum,psum再与wgt相乘
除以wsum;U、V通道处理类似。
1)配准(MFNR阶段的配准是利用匹配?)
a. 块匹配?
2)多帧融合
a. 升余弦窗?
先生成一个余弦窗口cwin(权重),x = 0.5 - 0.5 * cos(2Π(y - 0.5) / H),y = 0.5 - 0.5 * cos(2Π(x - 0.5) / H),cwin(x,y) = x * y;Y通道和U、V通道分别对
应各自的余弦窗口;然后块累加平均再与余弦窗乘积叠加到参考帧块上得到升余弦融合帧。
b. 选择EV-2和EV-4的清晰帧
3. 曝光融合
1)配准
该阶段是以MFNR的多帧降噪融合帧为参考,配准EV-2和EV-4的帧;使用MTB(优化中值阈值才可以)、相位相关、光流(直方图匹配后更准确)计算
位移,其中需要建立金字塔(每层做均值池化提高配准精度)。
2)根据不同的ISO值判断场景设定不同的融合参数
a. 计算融合权重
参考文章:FAST EXPOSURE FUSION USING EXPOSEDNESS FUNCTION (Mansour Nejati1 , Maryam Karimi1 , S.M. Reza Soroushmehr2 , Nader
Karimi1 , Shadrokh Samavi1,3, Kayvan Najarian2,3)
b. tone mapping
4. 后处理
1)对U、V进行一定的增益处理,解决一定的偏色问题
2)Y通道增强
a. 色阶拉伸(直方图拉伸,使其分布范围增大,增强对比度<通透性>),局部增强(CLAHE)。
3)Y、U、V通道单帧降噪,使用改进的引导滤波,同时Y通道需要在金字塔层上处理,保证噪声形态较散,没有涂抹感。
4)Y通道锐化处理
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)