ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

红外焦平面阵列非均匀性校正:原理、方法与Python实现详解

红外焦平面阵列非均匀性校正:原理、方法与Python实现详解 拿到一台红外热像仪最让新人发懵的往往不是分辨率低而是——把镜头对准一块温度绝对均匀的平面目标屏幕上却是一片固定花纹有的区域亮有的区域暗像贴了一层磨砂膜怎么调焦距都去不掉。你第一反应是探测器坏了其实不是。这恰好是红外焦平面阵列IRFPAInfrared Focal Plane Array的“出厂特性”每个像元对红外辐射的响应并不一致这就是非均匀性它带来的图像伪影叫固定图案噪声FPNFixed Pattern Noise。非均匀性如果不处理影响是连锁的。做测温同一黑体不同区域测出好几度温差做红外小目标检测残留的固定图案经过背景抑制后仍然是一条条“鬼影”虚警率直线上升做图像增强条纹和斑点会干扰对比度拉伸。所以非均匀性校正NUCNon-Uniformity Correction是从“能出图”到“能应用”之间绕不开的一道工序。这篇博文是这个系列的第一篇专门讲基本原理和基本方法把非均匀性的来源、数学模型、单点/两点/多点校正的推导和实操一次性讲透并附上可直接跑通的Python代码。适合刚接触红外成像的算法工程师、硬件工程师以及想彻底搞懂热像仪内部在做什么的嵌入式开发者。1. 非均匀性问题从哪来先搞清楚红外焦平面的“脾气”1.1 红外焦平面阵列是怎么工作的红外焦平面阵列是红外相机的核心感光器件由排列成M×N矩阵的光敏像元构成每个像元本质上就是一个微型的红外探测器。以非制冷微测辐射热计为例像元表面有热敏材料吸收红外辐射后温度升高电阻值发生变化读出电路ROIC把这个电阻变化转成电压信号再经过AD量化成数字灰度。制冷型探测器则是利用光伏效应或光电导效应把入射光子直接转成电荷信号链路上少了“热传导”这一步响应速度和灵敏度普遍更高。这里有个关键点需要先立住红外探测原理决定了它是一种“差分测量”而不是“绝对测量”。探测器输出的数字量反映的是入瞳辐亮度的相对变化。辐亮度不仅取决于目标温度还受环境温度、镜头自身辐射、大气路径衰减等因素影响。所以后续做非均匀性校正时目标并不是一步到位“校正成绝对温度”而是先做到“在均匀辐射输入下所有像元输出一致”这之后再通过辐射标定把灰度映射到温度。1.2 非均匀性的三类主要来源非均匀性的来源可以归纳成三大类理解这三类对后面选校正方**法非常有帮助。第一类是像元响应率不一致。半导体工艺做不到完美的均一性光敏面积、吸收层厚度、填充因子、掺杂浓度都会存在微小差异这些偏差导致每个像元对同样辐射的“放大倍数”不一样。放大倍数的差异在图像上表现为亮暗不一的固定斑点或者区域性的亮带它的学名叫响应率非均匀性PRNUPhoto Response Non-Uniformity。第二类是暗电流和偏置不一致。暗电流是探测器在完全没有入射辐射时因为热激发、缺陷能级等原因产生的微弱电流。每个像元的暗电流大小不同反映到输出上就是一个固定的偏置分量。读出电路的参考电压、电源噪声也会给每个像元叠加不同的本底。这一类非均匀性在低背景、短积分时间和高温工作环境下特别明显。第三类是时间相关的漂移。像元响应并非一成不变会随着探测器温度、环境温度、工作时间发生变化。比如非制冷探测器的像元温度每变化1°C暗电流和响应率都会有明显改变。加上读出电路固有的列噪声、行噪声非均匀性会“缓慢漂移”。这就是为什么NUC系数有时效性——今天标定好的系数过几个小时可能就需要刷新一次。1.3 用数学模型把非均匀性写下来工程上最常用的近似是线性响应模型。对焦平面上第(i,j)个像元入射辐亮度为L时输出灰度可以写成X(i,j) a(i,j) · L b(i,j) n(i,j)其中a(i,j)是该像元的响应率增益b(i,j)是暗电流等效偏置n(i,j)是随机噪声。忽略随机噪声后非均匀性问题本质上就是每个像元的(a,b)各不相同。a的散布来自工艺偏差b的散布来自暗电流和读出偏置差异。校正思路也因此变得非常清晰我们求出一组和像元位置相关的增益校正系数G(i,j)与偏置校正系数O(i,j)对原始输出做一次线性变换Y(i,j) G(i,j) · X(i,j) O(i,j)目标是让所有像元经过这个变换之后响应曲线落到同一条公共基准线上。也就是说不管一个像元原来的“脾气”是偏灵敏还是偏迟钝、本底是偏高还是偏低经过校正后对同样的辐射输入都应该给出同样的输出。这就是非均匀性校正最核心的逻辑。2. 校正前必须理解的几个指标响应率、暗电流与NETD2.1 像元响应率和增益差异响应率描述的是一个像元把辐射转成信号的能力单位通常是V/W或者数字灰度/辐射量。由于工艺散布响应率在各像元之间呈现统计分布它的离散程度用响应率非均匀性PRNU来衡量在均匀辐射输入下统计所有像元输出灰度的标准差与均值之比就是PRNU。PRNU的大小直接决定了NUC的难度。PRNU越小说明像元的“底子”越接近校正只需要做很小的修正PRNU越大增益校正系数G(i,j)这张图上的起伏就越剧烈校正后受非线性影响留下的残差也越大。工程上通常希望PRNU控制在2%到5%以内这样配合两点校正可以把残余非均匀性压到0.1%量级。如果PRNU超过10%靠简单线性校正已经很难救回来要么在工艺端筛选芯片要么必须上多点校正甚至基于场景的自适应校正。2.2 暗电流与偏置漂移暗电流是探测器在无光输入时依然存在的电流,主要来自载流子热激发。制冷型探测器把芯片温度降到77K甚至更低就是为了把暗电流压到几乎可以忽略的水平非制冷探测器工作在室温附近暗电流对温度极其敏感这也是非制冷相机开机后需要预热、工作过程中图像本底会缓慢变化的原因。暗电流带来的问题不仅是数值大小更麻烦的是“漂移”。由于探测器温度、环境温度、供电电压都在变化暗电流等效偏置b(i,j)会随时间缓慢移动。反映在图像上就是之前校正好的均匀场慢慢出现“水波纹”或者区域性亮暗变化。工程上针对这个问题常用“快门校正”在镜头前放一个均匀挡片实时采集一帧均匀背景用单点方式刷新偏置这样能快速把漂移拉回来但前提是挡片本身要足够均匀否则会引入新的非均匀性。2.3 NETD、PRNU与NUC的关系做红外系统的朋友经常把几个指标混在一起这里用一张表理清楚。指标度量对象对NUC的影响NETD噪声等效温差随机噪声限制NUC之后的最小可分辨温差NUC无法消除随机噪声PRNU响应率非均匀性增益响应率的固定差异决定NUC增益校正系数G的复杂度PRNU越大校正越难偏置非均匀性暗电流/读出偏置的固定差异决定偏置校正系数O的刷新频率残余非均匀性RNUNUC之后的固定图案残差直接反映NUC效果工程上优于此值小于1%一句话总结NUC主要对付的是“固定图案”也就是各像元响应率和偏置之间的差异NETD代表的是“随机噪声”不管你NUC做得再好随机噪声依然存在。所以一个系统想要夜间看得远、温度测得准既要有低的NETD也要有好的NUC两者缺一不可。3. 基本校正方法单点、两点与多点3.1 单点校正最朴素的“把偏置拉齐”单点校正是最基础、计算量最小的一种方法。它的前提是默认所有像元的响应率增益已经基本一致需要修正的主要是偏置差异。校正过程只需要采集一帧均匀背景图像然后让所有像元输出对齐到同一个灰度值。具体操作黑体设置在某个温度点比如场景温度的中间值采集N帧图像后做帧平均得到背景图像F(i,j)。计算整幅图像的均值F_mean。校正后的输出为Y(i,j) X(i,j) - F(i,j) F_mean这个公式的含义是每个像元减去自己的本底再加上统一的基准值。放在实际系统里最常见的单点校正就是快门校正——相机内部有一个均匀挡片需要刷新时把挡片移入光路拍一帧背景立刻算出一组偏置更新系数。因为速度快快门校正可以作为两点校正的“实时保鲜剂”在两次完整定标之间频繁执行。单点校正的问题也很明显它完全不修正增益差异。如果PRNU比较大或者场景动态范围很宽单点校正后低灰度区域可能看着还行一旦画面里同时出现冷目标和热目标固定图案又会冒出来。所以在高精度测温、大动态范围成像场景中单点校正只作为辅助手段真正的主力是两点校正。3.2 两点校正法工程上最常用的经典方法两点校正是红外成像领域最经典、应用最广泛的线性校正方法也是后面理解多点校正的基础。它通过两个不同温度下采集的均匀黑体图像同时解算出每个像元的增益校正系数G(i,j)和偏置校正系数O(i,j)。推导过程并不复杂。设低温黑体对应入瞳辐亮度为LL高温黑体对应LH。在忽略随机噪声的前提下每个像元在低温下的输出为XL(i,j) a(i,j) · LL b(i,j)在高温下的输出为XH(i,j) a(i,j) · LH b(i,j)对整幅图像计算低温、高温的全局均值XL_mean、XH_mean它们代表公共基准响应线上的两个点。我们希望校正后的输出满足G(i,j) · XL(i,j) O(i,j) XL_mean G(i,j) · XH(i,j) O(i,j) XH_mean两式相减得到增益系数G(i,j) (XH_mean - XL_mean) / (XH(i,j) - XL(i,j))代回第一式得到偏置系数O(i,j) XL_mean - G(i,j) · XL(i,j)最终校正输出Y(i,j) G(i,j) · X(i,j) O(i,j)用大白话理解就是全班同学身高参差不齐两点法找出“最矮的线”和“最高的线”两个参照然后按比例把每个人的身高拉伸或压缩到班级标准区间里。对于近似线性的红外探测器这个处理已经把绝大部分固定图案去掉了。实际计算增益系数时要特别注意一个问题如果某个像元是坏点或者响应率极低XH(i,j) - XL(i,j)可能接近于0G(i,j)会变得非常大直接把该像素放大成亮斑。所以代码里一定要对分母加保护或者在做两点校正之前先做坏像元检测和替换。3.3 多点校正把非线性问题拆成段来处理两点校正默认响应是线性的但真实红外探测器在大温度范围内的响应曲线往往是带弯曲的尤其是非制冷微测辐射热计在高温段和中温段的响应斜率就有明显差异。这时候两点校正会留下系统性的残差图像中心区域校正得很好但高温目标的边缘会出现从暗到亮的渐变过渡。多点校正的思路就是把非线性的响应曲线“切”成若干段每一段内近似看成线性然后用两点校正的方式逐段处理。常用的有两种实现。第一种是分段线性校正。在应用温度范围内等间隔选取M个黑体温度点比如从-20°C到150°C每10°C一个点这样得到17个定标点。对于任意一帧图像先根据场景整体灰度判断所在区间然后取该区间两端对应的L和H图像计算校正系数。切换区间时要对系数做线性插值避免段与段之间出现肉眼可见的跳变。第二种是多项式拟合校正。先对每个像元在不同黑体温度下的输出做二次或三次多项式拟合存下拟合系数校正时把某个像元的原始灰度代入它自己的多项式反推出对应的“等效辐亮度”再从这个辐亮度出发用全局标准响应曲线计算校正后灰度。这种方法的连续性和精度都更好但计算量比分段线性大在FPGA上实现也更费资源。实践中的选型原则是温度范围窄、精度要求不高用两点校正温度范围宽、或者系统长期工作在高温/低温极端条件下上分段线性多点校正对温度测量精度要求极高且硬件算力有富余才考虑多项式拟合校正。4. 实操记录两点校正从黑体定标到代码实现4.1 硬件准备与温度点选择做两点校正最理想的光源是面源黑体。选择黑体时要注意两个指标有效辐射面积要能完全覆盖探测器视场温度均匀性要好一般要求在0.05°C到0.1°C以内。如果黑体本身温度就不均匀那采集出来的“均匀背景”其实是自带条纹的后面校正出来的图像也会残留这些条纹。温度点的选择要覆盖实际应用的场景范围并且留出余量。比如你的应用场景温度大多处于10°C到50°C那低温点选5°C、高温点选55°C就比较合适。选点太少校正区间覆盖不够选点太多定标时间成倍增加。对于两点校正温度跨度也不宜太小否则XH - XL差异太小增益系数的数值和噪声都会被放大。我建议两个定标点之间的温差至少20°C以上。另外要强调一个容易被忽略的细节定标时的积分时间、增益档位、镜头焦距必须和实际使用保持一致。切换增益档位或者改变积分时间后像元的增益和偏置都会变原来的校正系数必须作废重新标定否则校正后图像反而会更乱。4.2 定标图像的采集流程定标过程看起来简单但细节决定成败。我的标准流程是第一步开机预热至少30分钟让探测器达到稳定工作温度。非制冷相机尤其要预热充分否则探测器温度还在爬升期暗电流漂移严重定标出来的偏置系数很快就不准了。第二步把相机固定好镜头正对黑体确保视场完全被黑体覆盖中间没有任何遮挡物。检查是否有杂散光从侧面进入镜头最好在暗室环境操作。第三步设置黑体到低温点等待控温稳定。黑体从当前温度跳到目标温度需要时间一般要等10到15分钟不能看着温度读数到了就马上采集因为黑体靶面温度均匀还要再稳定一会儿。第四步连续采集多帧图像并做帧平均。帧数建议不少于64帧条件允许就采256帧。多帧平均是为了抑制随机噪声对定标结果的干扰。注意采集期间不要碰相机、不要开关灯保持环境稳定。第五步重复第三步和第四步完成高温点定标。保存低温图像L和高温图像H以及对应的全局均值供后续计算使用。这套流程看着简单但我在项目里见过很多次“黑体没稳就开拍”导致的返工。定标数据如果不干净后面所有校正系数都是白算做出来效果比不校正还差。4.3 Python实现两点校正下面给出一段完整可运行的两点校正Python代码包含定标系数计算和模拟数据演示方便你在自己的数据上快速验证。import numpy as np def two_point_nuc(raw, low_img, high_img, eps1e-9): 两点非均匀性校正 raw: 待校正单帧图像 (H, W) low_img: 低温黑体定标图像多帧平均后 high_img: 高温黑体定标图像多帧平均后 low_mean float(low_img.mean()) high_mean float(high_img.mean()) # 逐像元增益系数分母加保护防止坏像元除零 gain (high_mean - low_mean) / (high_img - low_img eps) # 逐像元偏置系数 offset low_mean - gain * low_img corrected gain * raw offset return corrected为了验证算法效果我构造一组模拟数据模拟带有增益非均匀性和偏置非均匀性的探测器输出。# 模拟参数 h, w 256, 256 rng np.random.default_rng(42) # 理想场景一个横向渐变的目标灰度约4000~6000 scene np.tile(np.linspace(4000, 6000, w), (h, 1)) # 增益非均匀性标准差10% gain_map 1.0 0.1 * rng.standard_normal((h, w)) # 偏置非均匀性标准差100个灰度 offset_map 100.0 * rng.standard_normal((h, w)) # 低温定标图像辐亮度对应灰度3000 low_ideal 3000.0 low_img low_ideal * gain_map offset_map 5 * rng.standard_normal((h, w)) # 高温定标图像辐亮度对应灰度5000 high_ideal 5000.0 high_img high_ideal * gain_map offset_map 5 * rng.standard_normal((h, w)) # 实际场景图像 raw scene * gain_map offset_map 8 * rng.standard_normal((h, w)) # 执行校正 nuc_result two_point_nuc(raw, low_img, high_img) # 评估校正前 vs 校正后在均匀背景上的残余非均匀性 def rnu(img): return img.std() / img.mean() print(f校正前 RNU: {rnu(raw):.4f}) print(f校正后 RNU: {rnu(nuc_result):.4f})跑完这段代码你会看到校正前RNU可能在5%以上校正后下降到0.5%以内。我这里把ZTE代码注释写清楚这正是实际项目里需要的效果验证方式先看均匀场上的固定图案是否被压下去再去看真实场景的观感。4.4 校正效果评估RNU怎么看评估NUC效果不能只看“画面是否变干净”这种主观感觉要用指标说话。最常用的指标是残余非均匀性RNU采集一帧均匀背景图像减去均值后求标准差再除以均值得到百分比。RNU越小说明固定图案残留越少。工程经验上NUC做得好可以到0.1%到0.3%做到1%以内算合格。我习惯的评估分两步走。第一步是纯定量等黑体温度稳定在两点中间的某个温度比如两点是5°C和55°C那就把黑体设在30°C拍一帧均匀背景算RNU。第二步是定性观察看增益系数图G(i,j)和偏置系数图O(i,j)本身有没有异常。正常情况这两张图应该是平滑变化的如果出现大量孤立的“坏点”、网格、条纹说明定标过程有问题或者坏像元没有处理。还有一个容易被忽略的点校正系数是基于定标时的曝光参数和探测器温度得到的所以评估效果时也要在同样的条件下进行。如果在室内标定完拿到室外低温环境去测试温度变了偏置早就漂了RNU肯定会变差这不代表算法有问题而是工程系统需要考虑偏置实时刷新的问题。5. 常见问题与排查技巧实录5.1 校正后图像仍有条纹或网格状痕迹这是我在项目里遇到最多的问题。校正做完均匀背景上还是能看到纹路第一反应是算法写错了但排查下来往往是一下几个原因。现象可能原因解决办法校正后仍有横向条纹定标图像存在列噪声/行噪声增加定标帧数用非均匀性较小的读出模式重新采集出现网格状图案坏像元未剔除增益系数被异常值污染先做坏像元检测与替换再重新计算G和O黑体区域中间亮、边缘暗面源黑体温度不均匀或视场未完全覆盖换用均匀性更好的黑体调整镜头位置校正后出现块状“水印”定标时镜头表面有脏污或手印清洁镜头和窗口片重新定标两个温度点之间效果很好超出范围变差探测器响应非线性超出线性假设改用多点分段校正或多项式拟合校正排查这类问题我的经验是“先看图再算数”。把G(i,j)图直接显示出来正常情况它应该是一片缓变的图任何规律性的条纹、网格、亮斑都能直接看到。G图干净了再去看定标数据是否干净十有八九问题出在定标采集环节而不是后面的矩阵运算。5.2 定标温度点怎么选才合理很多新手问两个点到底选多少温度我的建议是不要硬套固定值而是根据应用场景来定。先明确系统使用的目标温度范围比如安防监控白天场景20°C到50°C工业测温场景100°C到500°C两者选点完全不同。选点时有两个原则。第一定标范围应该略宽于实际工作范围保证校正系数在边缘也有约束。第二两个温度点之间要有足够的温差如果温差太小XH(i,j)与XL(i,j)的差值和随机噪声处于同一量级算出的增益系数噪声很大校正后反而会引入额外噪声。另外温度点选择的“中间值”问题也需要留意。两点校正线性假设的本质是让校正后的响应在低温点和高温点处都落在理想响应线上但中间的响应并不是严格线性。所以如果你关心的目标温度集中在区间中部就可以考虑在目标温度附近加密定标点而不是简单等间隔布点。多点校正我在项目中通常按目标温度区间内“中间密、两端疏”的原则来选点效果比等间隔更好。5.3 没有黑体还能做校正吗很多现场项目不具备黑体条件这时候可以退而求其次用均匀面源替代。我实践过的方法包括均匀加热的金属平板、涂了高发射率黑漆的铝板、甚至对着完全空旷的天空或大面积的墙面。核心要求是目标面足够大、表面温度足够均匀并且覆盖整个视场。这些替代方案的精度肯定不如标准黑体但用于生产线的快速校准、或者在精确测温前做一个“粗糙NUC”是够用的。真正需要更高精度、且无法反复黑体定标的场景就要上基于场景的非均匀性校正Scene-based NUC利用连续帧场景信息估算消隐系数比如时域高通滤波法、神经网络法等等。这也是我下一篇文章要展开的主题。5.4 分享两个真实踩坑经验第一个经验是关于黑体稳定时间的。有次我在实验室做两点定标黑体显示已经达到设定温度我马上开始采集校正算法算完图像上总有一层缓缓变化的“水波”。折腾了一下午后来无意中多等了15分钟水波消失所有指标恢复正常。原因是黑体靶面中心的温度已经到位但靶面边缘还没有完全热平衡造成“显示稳定、实际未稳”的假象。从此我的定标流程里强制加入“温度到达后静置15分钟”这一步。第二个经验是关于定标帧数的。曾经为了赶测试进度把定标帧数从256帧减到16帧结果RNU从0.2%差到了0.8%画面观感下降非常明显。原因是16帧平均不足以把随机噪声压到比固定图案低一个量级随机噪声被“固化”进了偏置系数里。后来我给自己定了个规矩定标数据宁可多采几组也不要因为赶时间砍帧数因为返工的代价远大于多等几十秒的时间成本。红外非均匀性校正是一个看起来简单、实际坑很多的环节。两点校正的公式背下来很容易但真正要在不同探测器、不同环境、不同精度的项目里做好需要对原理有透彻理解更需要一点一滴积累现场经验。希望这篇“基本原理与基本方法”能帮你把地基打牢下一篇文章我会继续分享基于场景的非均匀性校正方法在没有黑体的情况下如何做自适应校正。
返回列表