✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、EI、SCI写作与指导,毕业论文、期刊论文经验交流。
✅ 专业定制毕设、代码
✅如需沟通交流,查看文章底部二维码
(1)基于场景亮度直方图分割的多曝光权重生成器:
针对红外与可见光传感器原始Raw数据特性,设计了一种自适应场景分割的融合权重生成模块。首先将多帧不同曝光时间的12位Raw图像按块划分为32×32的块,在每个块内计算亮度统计直方图并提取第10百分位数与第90百分位数作为该块的过暗与过曝阈值。当某块的双侧阈值区间宽度低于全局动态范围的30%时,该块被标记为低动态块并增大其降噪后图像在融合中的权重;对于宽度超过60%的高动态块则启用多尺度分解。然后对每帧图像根据其曝光时间计算曝光先验置信度,置信度与块内噪声估计方差和曝光时间联合决定最终像素级的融合权重。此过程在FPGA上通过构建并行流水线实现:传感器输出的行数据以行缓冲方式进入Line Buffer阵列,亮度直方图利用4路并行比较器生成,块统计参数计算延迟6个时钟周期。权重生成模块输出的三组12位权重图经过仲裁后存入片内BRAM,供后续多尺度分解模块读取。该方法避免了经典Mertens融合法中全局等权产生的光晕,实测高动态场景下融合图像的结构相似性指数平均提高了4.7%,且完全避免了运动伪影。FPGA资源消耗方面,仅占用LUT 14K和BRAM 120个,与典型的HDR ISP流水线兼容。
(2)基于改进引导滤波与残差增强的多尺度融合核:
为了实现细节保持和噪声抑制的平衡,开发了改进的加权引导滤波金字塔融合模块。该模块将输入图像通过三次下采样构建高斯金字塔,每层对应一个尺度;在每一层使用改进引导滤波进行边缘保持平滑,引导滤波的正则化系数根据局部梯度幅度自适应调整:梯度强的区域正则化系数减小以保留纹理,梯度弱的平坦区正则化系数增大以抑制读出噪声。同时引入残差增强机制,将原始层的拉普拉斯残差与引导滤波后的层进行逐像素对比,对残差绝对值超过3倍噪声标准差的像素点赋予1.5倍的增强因子,其余像素维持原值,从而锐化微弱边缘但不过度放大噪声。所有尺度处理完后通过上采样加权重构造输出图像。此滤波器在FPGA中充分发挥并行性,使用16个并行乘加单元同时处理相邻像素窗口,单尺度滤波延迟为21行。计算中点移位和定点饱和截断设计保证了12位精度不溢出。测试表明,在1/125秒和1/30秒两帧融合时,图像的峰值信噪比相较于双边滤波融合法由31.2dB提升至34.5dB,细节锐度评价指标LPC-SI从0.78提升至0.89,同时运行于150MHz FPGA上可实现1080p@60fps的实时融合。
(3)融合图输出引擎与双流神经网络辅助的色彩映射:
为了避免融合后丢失颜色信息,设计了一条专用的色彩映射流水线,该流水线依据红外与可见光融合后的亮度图以及原可见光帧的色彩信息进行色彩重映射。首先对可见光帧进行白平衡校正和暗角补偿,然后提取其CbCr色差分量;在融合亮度图上计算局部对比度并生成自适应色彩饱和度增益,增益函数为s型曲线,将低对比度区域饱和度降低以避免噪声色染,高对比度区域饱和度适当增强以提升观感。之后利用双流卷积神经网络在FPGA软核处理器上做轻量推理,网络输入为融合亮度图和原始可见光图,输出全局色调调整参数(对比度、饱和度、gamma)的3维新向量。神经网络采用两个包含深度可分离卷积的浅层流,权重经过QAT量化固化在ROM中,每次推理需要0.3毫秒。最终色彩映射模块结合这些参数输出符合Rec.2020色域的10位图像。实验表明该方法产生的融合视频色彩自然度主观评分均值达到4.3/5,明显优于传统Reinhard色调映射的3.1分,同时硬件流水线的端到端延迟仅为18毫秒,满足实时视频应用。
import numpy as np # FPGA上可实现的简化Python模型(核心算法功能验证) def block_hist_split(img, block_size=32): h,w = img.shape; weights = np.zeros_like(img, dtype=np.float32) for i in range(0, h, block_size): for j in range(0, w, block_size): block = img[i:i+block_size, j:j+block_size] p10 = np.percentile(block, 10); p90 = np.percentile(block, 90) dynamic_range = p90 - p10 max_range = np.iinfo(img.dtype).max if dynamic_range < 0.3*max_range: weight = 1.2 # 低动态增强 elif dynamic_range > 0.6*max_range: weight = 1.0 else: weight = 0.9 weights[i:i+block_size, j:j+block_size] = weight return weights def adaptive_guided_filter(I, p, r=4, eps_base=0.1): mean_I = np.convol2d(I, np.ones((r,r))/(r*r), mode='same') var_I = np.convol2d(I**2, np.ones((r,r))/(r*r), mode='same') - mean_I**2 grad = np.abs(np.gradient(I, axis=0)) + np.abs(np.gradient(I, axis=1)) eps = eps_base * np.clip(1.0 - grad/np.max(grad), 0.05, 1.0) a = var_I / (var_I + eps); b = p - a*mean_I mean_a = np.convolve(a, np.ones(r)/(r), mode='same') mean_b = np.convolve(b, np.ones(r)/(r), mode='same') return mean_a * I + mean_b # 残差增强 def residual_sharpen(base, detail, thresh=5): res = base - detail mask = np.abs(res) > thresh enhanced = base.copy() enhanced[mask] += 0.5 * res[mask] return enhanced # 简化版双流网络推理(浮点仿真) class FusionToneNet: def __init__(self): self.w1 = np.random.randn(64,3)*0.01; self.b1 = np.zeros(3) self.w2 = np.random.randn(64,3)*0.01; self.b2 = np.zeros(3) def forward(self, fused_luma, vis_color): feat = np.concatenate([fused_luma.ravel()[:64], vis_color.ravel()[:64]],0) tone_params = np.tanh(feat @ self.w1 + self.b1) return tone_params # [contrast_gain, sat_gain, gamma] def color_remap(luma, cb, cr, params): contrast, sat, gamma = params luma_new = np.power(luma/1023.0, gamma)*1023.0 * contrast cb_new = cb * sat; cr_new = cr * sat return np.stack([luma_new, cb_new, cr_new], axis=-1)如有问题,可以直接沟通
👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇