红外热成像传感器非均匀性校正(NUC)的硬件实现与调试
红外焦平面阵列(IRFPA)的每一个像元,从 InSb、MCT 到非制冷 VOₓ/uA 微测辐射热计,响应率天生不一致——同温度黑体照下去,输出灰度能差 30%。裸图就是"麻点 + 竖条纹",没法用。NUC(Non-Uniformity Correction,非均匀性校正)就是把每个像元的响应拉平到同一基准,硬件侧分"片上 NUC + 外置标定系数"两段走。下面以国产非制冷 400×300 / 640×512(VOₓ,NETD < 40 mK)为主线。
一、NUC 的三种硬件实现路径
1. 一点校正(Single-Point,室温单标定)
只在室温 T0 下一次标定,每个像元存一个 Offset,Gain 默认 1。公式:Y_corr[i,j] = Raw[i,j] - Offset[i,j]。
硬件最简单——sensor 的 ISP/ASIC 里给一片 SRAM(400×300×12 bit ≈ 1.44 Mb)存 Offset 表,上电从 OTP/eFlash 加载,实时减。但温漂大(VOₓ 的 Tc1 ≈ -2%/℃,Tc2 ≈ -5%/℃²),环境温度变 10℃,均匀性从 0.5% 飘到 3%,只适合恒温小像元场景。
2. 两点校正(Two-Point,主流)
用低温黑体 T1(如 20℃)+ 高温黑体 T2(如 50℃)各拍一张,每像元算:
/* 两点系数标定(上位机或 MCU 算完写 Sensor 寄存器)*/
for (i = 0; i < H; i++) {
for (j = 0; j < W; j++) {
Gain[i][j] = (T2 - T1) / (Raw_T2[i][j] - Raw_T1[i][j]);
Off[i][j] = T1 - Gain[i][j] * Raw_T1[i][j];
/* 写 Sensor 的 Gain/Off RAM */
sensor_write_reg(GAIN_BASE + addr, float_to_u16(Gain[i][j]));
sensor_write_reg(OFF_BASE + addr, float_to_u16(Off[i][j]));
}
}
实时路径:Raw → ×Gain → +Off → 输出。主流国产 sensor(如 Guide IR510、海康 H 系)ASIC 里 Gain/Off 双 12-bit RAM 是标配,640×512 双表约 6.7 Mb SRAM。
3. 多点+非线性(高端制冷款)
InSb/MCT 响应非线性强,3–5 点黑体(如 -20/0/20/40/60℃)分段拟合二阶多项式,系数存 ROM。非制冷 VOₓ 一般两点够用,高温段(> 80℃)才补第三点。
二、盲元处理(DPC)和 NUC 的绑定
NUC 解决"响应不一致",但还有"死像元/响应过低像元"——VOₓ 典型盲元率 0.1–0.5%。DPC 一般跟 NUC 同硬件路径走:
• 盲元表:OTP 里存盲元坐标 bitmap(1 bit/像元),640×512 → 320 字节够
• 替换算法:实时流里盲元位置用 4/8 邻域中值或均值替(中值抗边缘假影更好)
/* 实时 NUC + DPC 流水线(Sensor 内部 ISP 逻辑)*/
pixel_raw = fifo_read();
addr = i * W + j;
if (dpc_bitmap[addr]) {
pixel_out = median_4neighbor(buf, i, j); /* 盲元:邻域中值 */
} else {
pixel_out = pixel_raw * Gain[addr] + Off[addr]; /* 正常:两点校正 */
}
国产 sensor 一般把 DPC 放 NUC 前(先替盲再校正),避免盲元把 Gain/Off 算歪;也有反过来放的,看 ISP pipeline 顺序。
三、标定硬件链路
两点标定要的硬件配套:
1. 黑体源:温控精度 ±0.1℃(如 ERC 的 BB701),面源黑体 ≥ 100 mm 口径,覆盖全 FOV
2. 遮光筒:黑体→镜头之间加遮光筒(内壁 Acktar 黑绒),防环境光漏进
3. Sensor 积分时间(Tint)同步:标定 T1/T2 时 Tint 固定(如 VOₓ 给 12 ms),别让 AGV 自动调 Tint,否则 Raw_T1/Raw_T2 差里混了 Tint 变化,Gain 算飘
4. 温控板:Sensor 底板 Therm 电调(非制冷 VOₓ 一般控 25±0.1℃,温漂源头先压住)
标定流程伪代码:
/* 两点标定流程 */
blackbody_set(20); delay(3000); /* 等黑体温稳 */
capture_frame(Raw_T1);
blackbody_set(50); delay(3000);
capture_frame(Raw_T2);
calc_gain_offset(Raw_T1, Raw_T2, 20, 50);
burn_to_sensor_otp(); /* 写 OTP / 或存外置 EEPROM */
四、调试三指标
板子回来用黑体 + 均匀面源验证:
1. 非均匀性 NU = σ(V_i)/V_mean(校正后裸图去盲元后算),VOₓ 两点校正后 < 0.3% 算合格,< 0.15% 优秀
2. NETD:黑体 ΔT=1 K,输出灰度差 / 噪声 RMS,400×300 VOₓ 两点校正后应 < 40 mK
3. 盲元替换边缘:对着刀口靶看盲元邻域有无"拉丝"(中值替会稍糊,均值替有拉丝,二选一看场景)
⚠ 温漂验证必做:Sensor 底板 25℃ → 45℃,NU 不应涨 > 50%(两点校正好的一般 25→45℃ 只涨 20%)。涨太多说明 Gain/Off 表是"一点思维"做的,或黑体 T1/T2 温差太小(建议 ≥ 20℃ 跨度)。
五、三个翻车高发点
• 黑体没罩遮光筒:环境光(顶灯、窗户)漏进,Raw_T1/T2 里混了非黑体分量,NU 校正后剩 1–2% 条纹
• 积分时间和黑体不同步:标定 T1 时 Tint=12 ms、标定 T2 时 AGV 自动改成 10 ms(因为 T2 亮),Gain 表里混了 Tint 比,高温段校正后偏暗
• 盲元表中值替过度:运动场景(行人、车)盲元邻域出现"鬼影",因为中值在边缘处把真实梯度抹了——边缘区改用均值替或 3×3 加权
IR NUC 的真谛:两点校正(T 跨 ≥ 20℃)+ Gain/Off 双 RAM + 盲元中值替前置 + 黑体标定 Tint 锁死 + 25→45℃ 温漂 NU 涨幅 < 50%。这套走完,400×300 VOₓ 的 NETD 压到 35 mK 内,麻点图变均匀灰阶,后续测温算法(ΔT→℃)的误差才能压到 ±2℃ 以内。





