简介压缩包内为一份 MATLAB 脚本面向光学成像、遥感与医学图像分析领域的初级研究者聚焦偏振度计算、偏振相角分析与偏振融合处理。包内仅有 1 个 m 文件压缩包约 2KB轻量精简便于直接阅读、调试和二次开发。脚本实现了从多偏振状态图像中计算偏振度、提取偏振相角并与原始强度图像进行融合的算法流程能够帮助读者快速理解偏振图像处理的基本数学原理和常见融合策略。目前已有 470 人学习下载。通过该脚本可以掌握偏振度与相角的数值实现方式了解像素级加权、小波变换或多重分辨率分析等图像融合方法在具体代码中的落地思路同时对反射去除、对比度增强、材料表面检测等应用场景有一定参考价值适合作为入门偏振图像处理的启动模板。1. 偏振融合到底融的是什么强度图、偏振度与第四维信息普通相机只记录光强偏振相机额外记录光波振动方向。这就是标题里“偏振度、偏振强度、偏振融合、图像融合”四个词的来源一套把偏振相机原始数据转成可视图像的流程再和红外/可见光做联合增强。qzw3.zip 这类工程包通常就是为这个目的发布的把四方向偏振原图计算成强度图 S0 与偏振度图 DoLP再按强度加权重构出一张低光、雾天等低对比度场景下更“看得清”的输出图。这个名字能检索到的场景包括工业视觉检测、遥感地物分类和夜间辅助驾驶。适合刚拿到偏振相机的开发者、做红外与可见光图像融合的研究生以及被雾天和反光困扰的现场工程师。注意别把偏振度当成强度通道直接替换到融合流程里它本质是材质与边缘信号用错位置会毁掉整个输出。2. 偏振度与偏振强度从 Stokes 矢量到可计算的融合输入2.1 三个关键量S0、DoLP、AoP 各自在融合里扮演什么角色偏振成像的核心是 Stokes 矢量四个分量里真正常用的只有三个。S0 是总光强中文资料里常写作“偏振强度”或者就叫强度图 I它是融合时承载亮度信息的基底。S1 是 0° 与 90° 偏振方向的光强差S2 是 45° 与 135° 方向的光强差。偏振度 DoLP 由 S1 和 S2 合成公式写作 DoLP sqrt(S1² S2²) / S0取值在 0 到 1 之间0 表示完全非偏振1 表示完全线偏振。偏振角 AoP 则是 0.5 * arctan2(S2, S1)描述偏振主轴的朝向。做融合之前要先把这三个量的定位搞清楚。S0 是“像什么”提供灰度、纹理、轮廓这些人类视觉最熟悉的线索DoLP 是“材质与表面状态”人造物体边缘、金属表面、水面和塑料包装会改变反射光的偏振态这些区域的 DoLP 往往出现跳跃AoP 在普通融合里用得少更多的是用在需要区分目标朝向或者做偏振去雾的分支里。融合的信息增益来自 S0 和 DoLP 的不耦合同一个像素的亮度可能和周围几乎一致但 DoLP 因为表面法向变化突然拉高这种互补关系是图像融合有意义的前提。配套的一个常识判断是不是所有场景都适合做偏振融合。自然景物里土壤、植被、树皮这些漫反射表面 DoLP 普遍偏低人造物体的光滑表面和金属边缘 DoLP 偏高。如果整幅图的 DoLP 分布很窄说明偏振信息弱后面无论怎么调融合参数都很难有本质提升。这也是后面第 6 章要把“先验证偏振信息”放在第一步的原因。2.2 用 Python 把四方向偏振图转成偏振度与偏振强度图偏振相机输出到主机侧通常是 0°、45°、90°、135° 四个方向的光强图四张图尺寸一致、空间位置对齐。计算 Stokes 矢量和 DoLP 的最小实现非常短但参数直接影响输出质量。import numpy as np from scipy.ndimage import median_filter def compute_polarization(i0, i45, i90, i135, eps1e-6): # 四个入参为 float32形状一致 (H, W) # 单位要统一要么都是电子数(raw)要么都是 0~1 的归一化强度 s0 0.5 * (i0 i45 i90 i135) # 偏振强度/总强度图 s1 i0 - i90 # 0° 与 90° 方向差 s2 i45 - i135 # 45° 与 135° 方向差 dolp np.sqrt(s1**2 s2**2) / (s0 eps) # 偏振度0~1 区间 aop 0.5 * np.arctan2(s2, s1) # 偏振角弧度制 dolp_clean median_filter(dolp, size3) # 抑制比值放大产生的孤立亮点 return s0, dolp_clean, aop逻辑说明S0 取四方向平均而不是简单相加是为了消除相机增益档位不同带来的量纲问题S1 和 S2 的减法会抵消共模噪声但前提是四个方向的暗场底电平一致。分母里的 eps 是防止全黑像素除零取值 1e-6 对 float32 足够。median_filter 放在 DoLP 计算之后而不是之前这点很关键DoLP 的孤立亮点来自两路小信号相除后的比值爆炸提前对原始通道做平滑会把真实边缘一起抹掉计算后滤波既压噪又保边。参数调整上size3 是常用值再大就会开始模糊细小的边缘结构削弱后面偏振融合的边缘增益。如果图像分辨率高可以先对 S0 做一次 3x3 高斯平滑再传进来但不要对四个方向图做 5x5 以上的平滑。AoP 的角度定义在不同文献里有差异有的是 0.5 倍有的是 1 倍只要全流程统一就行别混用。2.3 计算前的预处理顺序为什么不能拿到图就直接算 DoLP很多第一次接触偏振融合的人直接把相机输出的四张图喂进 compute_polarization得到一张全是雪花点的 DoLP。问题多半不在算法在预处理顺序。我一般按下面这张表走每一步的输出作为下一步输入。步骤输入输出核心参数暗场减除四方向原图 同曝光暗帧扣除底电平的图暗帧取多帧均值平场校正暗场减除后的图增益均匀的图平场帧归一化偏振去马赛克分焦平面 Raw四方向全分辨率图插值核选双线性图像配准四方向图亚像素对齐的图相位相关或特征匹配偏振量计算S0/S1/S2DoLP、AoPeps1e-6分焦平面传感器的原始图是一个 2x2 的偏振马赛克0°、45°、90°、135° 交替排列必须先按像素相位拆分再插值恢复全分辨率否则算出来的 S1/S2 会有固定条纹。如果相机已经输出四方向图这一项跳过即可。配准这一步最容易被忽略四个方向即使有 0.5 像素偏差S1/S2 相减都会出现伪信号体现在 DoLP 上就是边缘上的亮虚线。常见做法是用相位相关估平移量再做 0.1 像素级别的插值对齐。预处理没有做完之前后面所有融合参数都是无效的。这个阶段省掉的每一分钟都会变成后面调融合参数的无限加班。3. 偏振融合与图像融合把偏振度变成权重图的三种做法3.1 为什么偏振融合能提升低对比度场景的可见性偏振融合的典型收益场景是雾天和低照度。大气中悬浮颗粒产生的散射光在特定散射角上偏振度很高而物体表面的反射光偏振态主要由材质决定两者在 DoLP 上有可分辨的差异。把 DoLP 做成权重图可以压低散射成分的亮度、保留目标反射成分本质上是利用偏振信息做场景分离而不是简单地“把两张图叠在一起”。另一个收益点是人造物体边缘。金属边缘、车窗、塑料外壳这些表面在 DoLP 图上会呈现明显的脉冲状响应而它们在普通强度图里可能只是平滑过渡。偏振融合把这些脉冲转成局部对比度提升等效于给边缘检测和后续目标分割提供了更强的输入。红外与可见光图像融合里常见的痛点是被测目标与环境温度接近热像里分不清这种场景下偏振通道可以作为第三个模态接入而不是替代红外。3.2 偏振融合的最小实现增益权重叠加与伪彩色映射最常见的偏振融合不是加权平均而是“强度图 偏振度增益”。加权平均 F w*S0 (1-w)*DoLP 的问题在于 DoLP 不携带绝对亮度把它和 S0 直接相加会把暗部压暗、亮部泛灰。改用乘法增益可以保证低偏振区的亮度不低于原图。import cv2 import numpy as np def polar_blend(s0, dolp, k1.5, gamma0.75): # s0、dolp 为 float32先各自归一化到 0~1 s0_norm cv2.normalize(s0, None, 0.0, 1.0, cv2.NORM_MINMAX) dolp_norm cv2.normalize(dolp, None, 0.0, 1.0, cv2.NORM_MINMAX) # 权重图偏振度越高的像素获得越高增益k 控制增强强度 weight np.clip(dolp_norm * k, 0.0, 1.0) # 乘法叠加亮度 强度 * (1 0.5*权重)0.5 是最大增益上限 fused s0_norm * (1.0 0.5 * weight) fused np.power(fused, gamma) # 伽马压缩压高光 fused cv2.normalize(fused, None, 0, 255, cv2.NORM_MINMAX) fused fused.astype(np.uint8) # 伪彩色图用于观察偏振度分布不参与最终融合 dolp_color cv2.applyColorMap( (dolp_norm * 255).astype(np.uint8), cv2.COLORMAP_JET) return fused, dolp_color参数说明k1.5 是大多数场景的起调值代表偏振度最高处的额外增益是 50%k 超过 2.0 后天空、水面、车壳这类高偏振区域容易饱和融合图会泛白。gamma0.75 在乘法叠加之后做目的是把被拉高的亮部压缩回合理范围gamma 小于 0.5 会让暗部噪声一起放大。增益上限 0.5 是有意为之取 1.0 时高偏振区亮度翻倍融合结果会看起来像局部曝光过度不利于后续给模型输入。这段代码里还有一个容易犯的错把伪彩色图直接当作融合结果去训练网络。JET 伪彩色编码会引入人为的颜色顺序模型学到的可能是“红高偏振”这个颜色映射关系而不是偏振本身的物理含义。伪彩色图只用于调试时肉眼确认 DoLP 分布是否合理。3.3 接入红外可见光图像融合拉普拉斯金字塔的接入方式偏振融合做完之后下一步经常是和红外图再融一轮。红外图提供热辐射的整体分布偏振增强图提供边缘和材质细节两者一个偏低频、一个偏高高频适合用拉普拉斯金字塔在频域上做融合。常见做法是先用引导滤波把偏振增强图和可见光图做一次结构对齐再把结果和红外图做金字塔融合。import cv2 def laplacian_fuse(img_a, img_b, levels2): # img_a、img_bfloat320~255 范围 def build(g): lap [] cur g.copy() for _ in range(levels): down cv2.pyrDown(cur) up cv2.pyrUp(down, dstsize(cur.shape[1], cur.shape[0])) lap.append(cur - up) # 高频细节层 cur down lap.append(cur) # 最后保留低频基底 return lap la build(img_a) lb build(img_b) # 逐层平均融合 fused [(0.5 * x 0.5 * y) for x, y in zip(la, lb)] # 自底向上重建 out fused[-1] for i in range(levels - 1, -1, -1): out cv2.pyrUp(out, dstsize(fused[i].shape[1], fused[i].shape[0])) out out fused[i] return out逻辑说明build 函数把输入图拆成多层高频细节加一层低频基底高频层里包含边缘和纹理低频层里包含整体亮度分布。融合时每层做 0.5/0.5 平均重建时用 dstsize 锁定尺寸避免因奇数分辨率导致逐级上采样尺寸错位。levels2 对 512 以下分辨率够用大图可以提到 3再高会开始把噪声也当成细节融进去。这个流程里红外图和偏振增强图的权重不一定要 0.5/0.5。如果目标区域热异常明显把红外权重调到 0.6如果任务是看结构细节偏振增强图权重调到 0.6。需要强调金字塔融合解决的是“怎么融”解决不了“没对齐”的问题两路图像有视差时任何频域融合都会产生重影这条在第 4 章单独展开。4. 偏振融合避坑指南四类高频翻车现场4.1 DoLP 图全是雪花点不是算法错是输入没对齐现象计算出来的偏振度图密密麻麻全是亮点目标的整体轮廓还能辨认但边缘线上满是颗粒状噪声融合后图像花成一团。原因三个来源最常见。一是暗场底电平没扣干净四个方向的传感器本底不一致S1/S2 相减时残留的固定模式噪声被除法放大二是分焦平面 Raw 没有做偏振去马赛克就直接拆通道导致相邻像素互相混叠三是四个方向图之间有亚像素偏移边缘处 S1/S2 相位错位相减产生伪响应。解决按第 2.3 的预处理顺序走完暗场、平场、去马赛克、配准四步再计算 DoLP。如果设备拿不到专用暗帧临时手段是盖上镜头盖拍一张同曝光帧做近似暗帧但光圈没完全遮光时误差会直接进到 S1/S2效果只能算凑合。计算后加 3x3 中值滤波可以进一步压掉比值噪声但别指望滤波解决配准问题。4.2 过曝区域偏振度虚高融合后高光溢出现象天空、车顶、水面反光这类本身就亮的区域融合后变成一整片白色完全丢失纹理。原因传感器在过曝区域饱和后S1 和 S2 趋向于 0而 S0 趋向满量程两者相除时 S1/S2 的微小残差被基数放大DoLP 反而得到一个不真实的偏高值。这个值进入权重图后把原本就亮的区域又加了一轮增益直接溢出。解决在权重图计算前先做饱和检测。用 S0 的 8bit 表示为例阈值超过 245 的像素直接标记为无效区把权重强压到 0。实现上就是在 weight 计算后乘一个掩码mask (s0_norm * 255 245).astype(np.float32) weight weight * mask阈值不是拍脑袋定的不同相机在高光区的响应曲线不同最可靠的办法是拍一张带漫反射白板的图找出亮度响应开始弯曲的拐点把阈值设到拐点以下 10 个灰阶。这个坑的隐蔽之处在于过曝区面积小的时候肉眼不易发现但进入目标检测流程后误检率会明显上升。4.3 融合图像边缘光晕权重图没有经过结构对齐现象目标轮廓外圈出现一道亮边或暗边特别在 DoLP 跳变剧烈的金属边缘上最明显融合图看起来像给目标描了一圈。原因DoLP 的边缘是脉冲状的直接乘到亮度图上等于在边缘位置叠加了一个冲击响应再经过 gamma 压暗后脉冲两侧就呈现出光晕。这是偏振融合里最常见的图像融合伪影。解决不要直接用原始 DoLP 做权重先用引导滤波把它和 S0 的结构对齐。引导滤波的输入是 DoLP引导图是 S0 的归一化结果半径 r 取 8正则化 eps 取 1e-4。eps 越小边缘保持得越锐但也会把 DoLP 里的残留噪声保留下来eps 取 1e-2 时结构对齐更彻底但偏振边缘的增强幅度会被摊薄。没有 OpenCV 额外模块时可以自己写一个盒式滤波版的引导滤波或者退而求其次对 DoLP 做一次形态学开运算只能缓解做不到真正的结构引导。4.4 偏振图与红外图融合重影没做配准就进金字塔现象红外和偏振增强图融合后目标轮廓出现明显的双影边缘有残影拖尾。原因红外相机和偏振相机在物理上是两个镜头视场、焦距、光心都不一致拍同一场景时同一个点在两幅图里的位置有偏移。拉普拉斯金字塔融合不会自动对齐这个偏移它只是把两幅图的频域分量叠在一起所以偏移越大重影越严重。解决融合前先做两图配准。常规做法先用互信息或 ORB 特征点估计全局平移和仿射变换再用 ECC 迭代精配准。配准完成后把两图做 50% 透明叠加检查一遍边缘重合是能进金字塔融合的前提。偏振增强图和红外图之间的灰度分布差异大直接用灰度相关做匹配容易失败用互信息更可靠。这个坑在红外可见光图像融合任务里也常见不是偏振融合独有只是偏振增强图高亮边缘多重影会格外扎眼。5. 融合参数与质量指标怎么调参数才不是玄学5.1 四个必调参数增强系数、伽马、平滑半径、权重上限偏振融合的翻车有一大半不是原理错而是参数没配对。整理成一张表方便对照调整。参数典型范围主要影响调整顺序k 偏振增益0.8~2.0偏振结构的增强幅度越大高偏振区越亮先定gamma0.5~1.0亮部压缩强度越小暗部越明显第二平滑半径3x3 中值 / r4~8 引导滤波噪声抑制与边缘保持的取舍第三权重上限0.3~0.7防止增益溢出最后调整顺序我一般固定为“固定 gamma0.75从 k1.0 开始按 0.1 步进扫找到对比度最高且不过曝的 k再回头微调 gamma最后动平滑半径”。k 和 gamma 高度耦合k 调高了gamma 就得相应加大压住亮部如果两者一起调永远说不清是哪个参数起了作用。平滑半径尽量不要动大它影响的是噪声形态而不是融合的观感改大了容易让图像变塑料质感。权重上限这个参数容易被忽略。polar_blend 里用了一个固定 0.5 的上限在强偏振场景可以放宽到 0.7但超过 0.7 后融合图会把偏振度直接投影成亮度相当于抛弃了强度图的灰度层次。对这个参数的经验是宁可让偏振结构欠增强也不要让融合图过曝。5.2 用信息熵和平均梯度做客观评价偏振融合的主观评价不可靠同一张图在不同显示器上差别很大。常规做法是计算融合前后的信息熵和平均梯度用两个数判断信息量有没有真实提升。import cv2 import numpy as np def entropy(img): hist cv2.calcHist([img], [0], None, [256], [0, 256]).flatten() hist hist / hist.sum() return float(-np.sum(hist * np.log2(hist 1e-12))) def mean_gradient(img): gx cv2.Sobel(img, cv2.CV_32F, 1, 0, ksize3) gy cv2.Sobel(img, cv2.CV_32F, 0, 1, ksize3) return float(np.mean(np.sqrt(gx**2 gy**2))) def evaluate_fusion(s0, fused): return { H_before: entropy(s0), H_after: entropy(fused), G_before: mean_gradient(s0), G_after: mean_gradient(fused), }逻辑说明信息熵反映灰度分布的丰富度融合后熵值不涨说明偏振通道没有带来新的灰度层次平均梯度反映边缘强度梯度提升太小说明融合增益被引导滤波的平滑吃掉了。一组值得参考的判断标准熵提升 5% 以上且梯度提升 10% 以上融合才算有效果如果熵涨了但梯度跌了很可能融合图被过度平滑检查引导滤波的 eps。这两个指标有一个共同盲区它们不惩罚伪影。光晕、重影、过曝都可能同时拉高熵和梯度所以指标只能用来筛选参数不能用来替代第 4 章的人工检查。每次调参后跑一遍 evaluate_fusion再抽三张典型场景图放大看边缘两者结合才可靠。5.3 客观指标之外用下游任务做最终验收熵和梯度是中间指标最终投入决策要看下游任务。做目标检测就用同一批图分别走“原图输入”和“偏振融合图输入”两条管线对比 mAP 或 IoU做图像分割就对比 Dice。一套稳妥的验证方式是固定训练超参数只切换输入图像跑完对比指标曲线。如果指标提升不到 1 个点说明这套偏振融合对当前任务没有带来有效信息设计方案再精巧也得放弃。偏振融合和红外可见光图像融合的验收逻辑一致融合图的价值不在于“看起来更清晰”而在于让下游算法更稳。这个“稳”字不是玄学是几十张测试图上的指标分布方差。方差大说明融合结果对场景敏感需要回看是配准问题还是权重参数问题而不是继续调 k。6. 先验证偏振信息再上融合强度三个自检步骤第一步看 DoLP 直方图。把 2.2 算出来的 DoLP 拉成直方图如果峰值低于 0.1 且分布集中在很窄的区间说明这个场景的偏振信息很弱后续增益最多提升 5% 以内值得考虑是不是传感器增益不够或者场景本身漫反射占主导。峰值在 0.2 以上、右尾有明显拖尾偏振信息才算可用。第二步算局部增益。选目标区域里的 10 个边缘 patch统计融合前后局部标准差的平均提升比例。提升小于 1.1 说明偏振融合对这个目标的边缘贡献不足优先检查预处理里的配准和饱和掩码而不是继续调 k。这一步 20 行代码就能完成比肉眼判断可靠得多。第三步消融对比。同一套图片同一套训练参数分别跑“仅 S0”“S0DoLP 融合”“S0DoLP红外金字塔融合”三组指标。只有对比出来的提升才是真实提升。我自己第一次做偏振融合时犯过最蠢的错误直接把 DoLP 当强度通道叠加雾天去除了目标的铝合金纹理却全变成彩色条纹事后才发现是少了饱和掩码和引导滤波这两步。从那以后每次拿到新的偏振工程包第一件事就是按这三个自检步骤把信息底摸清再谈参数和融合层级。偏振融合不是万能的但偏振信息确实存在验证对了方向投入才有回报。希望帮到你。本文还有配套的精品资源点击获取