由于光学成像硬件设备的理论和技术限制,通过单个传感器或单个拍摄设置获得的图像只能获得部分图像信息。因此,来自不同传感器或不同拍摄设置的图像的融合有助于丰富图像信息。在各种图像融合任务中,红外和可见光图像融合是应用最广泛的之一。
红外传感器可以捕捉物体的热辐射,但易受噪声影响,难以捕捉纹理信息
。相反,
可见图像通常包含丰富的结构和纹理信息,但容易受到照明和遮挡
。它们之间的互补性使得生成包含热对象和纹理细节的融合图像成为可能。红外与可见图像融合已广泛应用于军事、目标检测和跟踪、行人再识别、语义分割等领域。
彩色保真度的说明。红色、黄色和绿色的虚线圆圈分别表示墙壁、路面和植被的可见图像和融合图像之间的颜色差异。与现有方法相比,DifFusion具有更高的色彩保真度。
如图1 (d)所示,融合图像具有较高的色彩保真度,更适合于人类的视觉感知。在融合结果评价方面,除了现有的用于量化强度和梯度保真度的指标外,还引入了一个量化颜色保真度的指标。通过提出的Dif-Fusion,
红外和可见图像可以简单地输入模型,而不进行颜色空间变换
。
传统的红外和可见光图像融合算法一般可分为稀疏表示、多尺度变换、子空间表示、显著性检测和混合方法五类。
稀疏表示理论
的主要思想是,图像信号可以表示为一个过于完整的字典中最小可能的原子或变换原语的线性组合。过度完备性表明字典中的原子数大于信号的维数。在图像融合中,稀疏表示通常从一组训练图像中学习一个完整的字典,从而捕获固有的数据驱动的图像表示。过度完整的字典包含丰富的基础原子,允许更有意义和稳定的源图像表示。
多尺度变换
可以将原始图像分解为不同尺度的子图像。多尺度变换类似于人类的视觉过程,可以使融合后的图像具有良好的视觉效果。
基于子空间表示的方法
旨在将高维特征投影到低维子空间中。投影到低维子空间可以帮助捕获原始输入图像的固有结构。此外,与高维空间相比,低维子空间中的数据处理可以节省时间和内存。常用的基于子空间表示的方法包括主成分分析(PCA)、独立成分分析(ICA)和非负矩阵分解(NMF)。
显著性检测模型
模拟人类行为,并从图像或场景中捕获最突出的区域/对象。近年来,基于显著性检测的红外和可见光图像融合方法主要可分为
权重计算
和
显著性目标提取
两类。研究者探索混合方法,
常用的混合方法包括混合多尺度变换和稀疏表示
、
混合多尺度变换和显著性检测
等。
由于
神经网络具有良好的特征学习能力和非线性拟合能力
,研究人员探索了基于深度学习的数据驱动的红外和可见光图像融合方法。这些方法主要包括:
1.基于AE 的融合方法
大多使用编码器结构从源图像中提取特征,并使用解码器结构完成图像重建。DenseFuse是一种典型的基于AE的方法。该方法的编码网络与卷积层、融合层和密集块相结合,其中每一层的输出与每一层连接。然后用解码器重建融合后的图像。为了提高编码器的特征提取能力,研究者提出了一种名为NestFuse 的方法。从多尺度的角度来看,该方法可以从基于密集连接的输入数据中保存大量的信息。SEDRFuse是一个具有残差网络的对称编码解码器。在融合阶段,利用训练后的提取器提取中间特征和补偿特征,然后将从中间特征得到的两个注意图乘以中间特征进行融合。
2.基于cnn的融合方法
,一个典型的方法是PMGI [53]。该方法是一种基于梯度和强度比例保持的快速统一图像融合网络。同时,该方法引入了一个路径传输块,在不同的路径之间进行信息交换,可以预先融合梯度信息和强度信息,从而增强待融合的信息。为了自适应地确定梯度信息保留的比例和保留更完整的纹理结构,提出了SDNet[27]。对于梯度保真度,该方法根据纹理丰富度确定梯度分布的优化目标,并通过自适应决策块引导融合图像包含更多的纹理细节。为了为多源信息的集成提供空间指导,stdfusion网络采用了一个显著的目标掩模来帮助完成融合任务[4]。为了将融合任务与高级视觉任务相结合,提出了一种以高级语义任务为辅助的融合方法[55]。此外,还有一些方法来研究光照条件如何影响图像融合。
3.基于GAN的图像融合技术
,利用了GAN能够以无监督的方式估计概率分布。其中,FusionGAN在生成器和鉴别器之间创造了一个对抗性的游戏。生成器的目的是生成融合图像,而鉴别器则试图迫使融合图像包含可见图像的更多细节。为了解决鉴别器仅用于区分可见图像的问题,提出了一种双鉴别器条件生成对抗网络(DDcGAN),该网络使用两个鉴别器来识别融合图像和源图像之间的结构差异。为了帮助生成器聚焦于红外图像的前景对象信息和可见光图像的背景细节,研究人员利用多尺度注意机制将红外图像和可见光图像融合为生成器和鉴别器AttentionFGAN。
为了平衡红外图像和可见图像之间的信息,提出了一种基于多分类约束的生成对抗网络(GANMcC)的融合方法。然而,上述基于生成模型的融合方法,其生成器在训练过程中增加了梯度保真度和强度保真度约束,无法实现红外和可见光图像在潜在空间中的分布构造。同时,现有的方法通常是将三通道可见光图像转换为单通道图像,这使得充分利用多光谱信息和实现高彩色保真度具有挑战性。
扩散模型已经成为一个强大的深度生成模型家族,在许多领域具有打破纪录的性能,包括
图像生成,图像修复,图像超分辨率,和图像到图像转换
。此外,从扩散模型中学习到的特征表示在鉴别任务中也非常有用,包括图像分类、图像分割和目标检测。扩散模型是一种具有正向过程和反向过程两个过程的深层生成模型。在前向过程中,通过加入高斯噪声,输入数据在多个时间步长内逐渐被干扰。在反向过程中,模型的任务是通过减少添加的噪声与预测噪声之间的差异,通过多个反向时间步长恢复原始输入数据。
由于模型生成的高质量和多样性,扩散模型被广泛用于生成。随着扩散模型在各个领域的不断发展,打破了GAN在图像生成领域中的长期主导地位。
红外图像和可见光图像的融合也可以看作是一项图像生成任务
。本文探讨了一种利用扩散模型来实现最先进的融合结果的有效方法。
本节将详细描述基于扩散的多模态数据的图像融合框架。该方法的主要思想如图2所示。可见光图像和红外图像对沿着通道维度连接,为扩散模型提供多通道输入。在前向过程中,将多通道数据逐步添加到高斯噪声中,直到数据接近纯噪声
P(I
t
|I
t−1
)
。然后,反向过程试图在去噪网络
Q(I
t−1
|I
t
)
的帮助下预测和去除添加的噪声。然后,可以从扩散模型中提取扩散特征,并输入到所提出的多通道融合模块中。彩色融合图像将在提出的多通道损耗的指导下直接由提出的框架产生。
I
0
和I
t
表示具有t个时间步长的前向扩散过程中的多通道输入和多通道数据。P(·|·)和Q(·|·)表示正向扩散和反向扩散过程。L
MCI
和L
MCG
分别代表多通道梯度损失和多通道强度损失。
接下来,首先将讨论扩散模型如何学习多通道分布并生成新的图像对。接下来,详细地提出了一种基于扩散模型的多源信息聚合方法。最后,我们引入了多通道强度损失和多通道梯度损失来指导融合网络的训练过程。
给定一对配准的红外图像I
ir
∈R
HW1
和可见图像I
vis
∈R
HW3
,其中H和W分别表示高度和宽度。为了学习多通道数据的联合潜势结构,将1通道红外图像和3通道可见光图像连接起来,形成4通道图像,用I∈R
HW4
表示。我们采用去噪扩散概率模型(DDPM)中提出的扩散过程来构造多通道数据的分布。多通道图像的前向扩散过程是通过T个时间步长逐步添加噪声。 在相反的过程中,噪声通过T个时间步长逐渐被消除。用正向和反向过程训练扩散模型的目的是通过建模4通道图像在潜空间中的扩散来学习红外和可见图像的联合潜在结构。
-
前向扩散过程:由非平衡热力学启发的前向扩散过程可以看作是一个马尔可夫链,它在T时间步长的数据中逐步增加高斯噪声。在时间步长t时,有噪声的多通道图像可以表示为:
式中,Z为标准正态分布。
I
t
和
I
t−1
分别表示加入t和t−1次高斯噪声产生的4通道噪声图像。γ∈R
HW4
为高斯噪声。
α
t
控制时间步t中添加的高斯噪声的方差。给定原始输入I
0
∈R
HW4
,可以通过等式推导出它的表达式(1)和等式 (2):
在前向扩散过程中,给定时间步长t、方差调度α1、…,αt和采样噪声,通过等式可以直接计算出时间步长t的噪声多通道样本。
-
反向扩散过程:在反向扩散过程中,利用神经网络进行一系列较小的去噪操作,获得原始的多通道图像。在反向过程的每个时间步长中,对有噪声的多通道图像I
t
进行去噪操作,获得前的图像I
t−1
。I
t−1
在此条件下的概率分布可以表示为
σ为条件分布
Q(I
t−1
|I
t
)
的方差,可以表示为:
β
t
= 1 − α
t
。条件分布
Q(I
t−1
|I
t
)
的均值
µ
θ
可以表示为:
ε
θ
(·,·)是一个去噪网络,输入是时间步长 t 和有噪声的多通道图像 I
t
.
-
损失函数:首先,我们在训练集中采样一对配准的可见光和红外图像对(I
ir
,I
vis
),形成多通道图像 I,然后从标准正态分布中采样噪声γ。第三,我们从均匀分布中采样时间步长t∼U({1,…,T})。完成上述采样后,扩散模型的损失函数可表述为:
去噪网络的结构:为了预测前向扩散过程中添加的噪声,去噪网络εθ(·,·)的结构采用了SR3 中使用的U-Net结构。
SR3主干由收缩通道(contracting
path)、膨胀通道(expansive path)和扩散头组成
。收缩通道和膨胀通道由5个卷积层组成。扩散头由单个卷积层组成,用于产生预测的噪声。
图3显示了我们训练的扩散模型生成的成对可见和红外图像。这些图像对可以看到在视觉上类似于真实的可见光和红外图像。在相应的红外图像中突出显示的目标也显得可信。这些结果表明,扩散模型是构建多通道数据分布的有力工具。
训练去噪网络后,我们
利用去噪网络提取多通道特征
。在图像融合训练阶段,我们使用两种损失(即多通道梯度损失和多通道强度损失)进行训练。利用多通道loss,
可以直接生成三通道融合的图像,而不需要进行颜色空间变换
。
-
多通道扩散特征。
SR3主干的扩展path 包含5个卷积层,输出特征图大小为:W/16H/16、W/8H/8、W/4H/4、W/2H/2、WH。使用多通道融合模块融合去噪网络的5个阶段的多通道扩散特性。
对于五个膨胀层的五个阶段特征,我们将它们加起来,并将它们输入融合头,生成I
f
∈R
HW3
的融合图像
。具体来说,应用3×3卷积层将高维融合特征映射到3通道输出。采用leaky ReLU和Tanh作为激活函数。去噪网络和多通道融合模块的结构如图4所示
-
融合过程损失函数。
现有的梯度loss是为单通道融合图像设计的。为保留可见图像的纹理信息,在保持梯度的同时直接生成三通道融合图像,我们扩展了现有的梯度损失,提出了多通道梯度损失
L
MCG
:
其中,∇表示梯度算子。I
f
1
、I
f
2
和I
f
3
表示融合图像的三通道(即红色、绿色、蓝色)。I
vis
1
,I
vis
2
和I
vis
3
表示输入可见图像I
vis
的3通道。热辐射通常以像素强度为特征。我们应用强度损失
使融合的图像具有与红外图像和可见光图像相似的强度分布
。然而,与梯度loss 类似,强度lossv被设计用于生成单通道融合图像。我们将现有的强度loss 扩展到多通道强度损耗L
MCI
,可以表述为:
现有的融合方法通常通过颜色空间转换来保存颜色信息
。为了解决这一问题,并充分利用扩散特性,本文直接生成了具有多通道梯度和强度损失的三通道融合图像。
数据集
:MSRS 、RoadSence和M3FD数据集的彩色和红外图像对来评估所提出的框架。与六种最先进算法进行比较: FusionGAN、SDDGAN、GANMcC、SDNet 、U2Fusion 和TarDAL。SDNet和U2Fusion是基于CNN架构的融合方法,而FusionGAN、SDDGAN、GANMcC和TarDAL则是基于生成模型及其变体。对于正在比较的方法,融合的图像是使用公共可访问的代码和预训练的模型生成的。为了产生用于视觉分析和定量评价的颜色结果,将比较方法的单通道融合结果在后处理中转换为彩色图像。
评价指标
:在定量评价中使用了6个统计指标,其中5个指标分别是虚拟信息(MI)、视觉信息保真度(VIF)、空间频率(SF)、Qabf 和标准差(SD)。MI主要评估来自初始图像对的信息在融合图像中的聚合程度。VIF评估在融合图像中出现的信息的保真度。组合数据中的空间频率相关信息由SF进行测量。利用Qabf对源图像的边缘信息进行量化。SD主要评价复合图像的对比度。
具体来说,我们引入了
Delta E,一种建立在CIELAB空间中的色差计算指数,被认为更符合人类感知系统
,以量化融合图像与原始可见图像之间的颜色失真。Delta E是一种颜色距离测量。由于感知的不均匀性,人眼对某些颜色比其他颜色更敏感,因此直接在颜色空间中测量的欧氏距离与人类的感知不匹配。Delta E作为解决这些问题的解决方案,以及对中性颜色、亮度、色度、色差、色调和色调旋转进行一些修正
需要注意的是,虽然其他度量需要原始图像,但SF和SD度量可以直接在融合的图像上计算出来。较低的Delta E值表明,颜色失真越小,融合质量越好,但其他5个指标则相反,融合值越高,融合结果越好
训练细节
:MSRS上训练(1083对可见光和红外图像的训练对,361对测试图像),随机裁剪160×160个patch。我们
提取在三个时间步长(如5、50、100)生成的扩散特征,形成多通道扩散特征
。训练融合模块,利用Adam优化器,学习率0.0001。batchsize为24,并且该模型被训练为300个epoch。实验硬件:NVIDIA RTX3090 GPU和3.80 GHz Intel ® Core(TM)i7-10700K CPU的工作站。
-
定性结果
:
MSRS数据集包含白天和夜间两个场景,从两种场景中分别选择两对图像来显示来自不同模型的结果。红外图像突出了白天场景中具有高热辐射信息的物体,而可见图像包含丰富的纹理和颜色信息。融合图像强调红外图像中的重要目标,保持可见图像的细粒度纹理和颜色信息。
图5中的红外图像突出显示了三个行人,它们在所有方法生成的融合图像中都坚持了下来。然而,
只有我们的方法和TarDAL的结果与原始的可见图像非常相似
。通过其他方法(如FusionGAN、GANMcC等)获得的
合成图像在视觉上颜色较深,并且有很大的颜色失真
,比如在由SDDGAN,U2Fuison,SDNet制作的融合图像中,绿树变成了黑色。图5中的红色方框放大了屋檐下窗户的细节,以展示了我们的方法在详细维护方面的好处。只有FusionGAN、SDDGAN、TarDAL和我们的方法的结果表明,红外图像中屋檐下区域的亮度略高于周围环境。但只有我们的方法才能清楚地保持窗户独特的轮廓和安排。此外,我们的方法可以很容易地识别融合图像中的前景(绿色植物)和背景(窗户下的墙壁)。
另一对日间图像如图6所示。红外中 2个骑人和远处行人突出显。绿色区域的白色的标志,只在可见光图像中可见。一些方法(例如,FusionGAN,GANMcC)很难清楚地显示这些特性。U2Fusion和SDNet可以在红框中显示结构信息,而SDDGAN和TarDAL可以在绿框中强调结构信息。然而,只有我们的方法才能同时保持两个矩形中的关键特征。以上分析反映了我们的
方法在颜色保存、学习互补信息、特征细节等方面的优点
。
图7中的红色和绿色区域:红色方框有两个行人;绿色有一个招牌,文字在可见图像中突出显示,但在红外图像中是完全黑色的。红色方框还包含了中下区域可见图像中的斑马线。所有方法不同程度地强调红框中的两个行人。然而,首先,原始红外图像中被衣服覆盖的身体不如其他区域亮。这种差异被SDDGAN和TarDAL忽略了,即整个身体同样明亮,导致结构信息的丢失。其次,许多方法(如FusionGAN、GANMcC、U2Fusion、SDNet)都忽略了可见图像中的斑马线信息。我们的方法都避免了这两个问题。此外,与其他方法相比,
该方法更好地保存了绿色框中可见图像的信息,包括亮度、颜色和清晰度
。
在图8中第二对夜间图像,展示了复杂的照明场景。在红外图像中,突出显示的物体是一个行人。中等亮度的区域位于窗口内,亮度较弱的区域是右边不规则的墙面。可见图像中具有大量颜色和纹理的区域,如白色汽车和路面(图像左侧),且窗口区域是明亮的。
我们期望融合后的图像在红外图像中包含不同亮度水平的关键信息
。此外,我们希望保持可见图像中颜色和纹理的真实性。从FusionGAN、GANMcC、U2Fusion和TarDAL中区分放大图像的表面特征具有挑战性。虽然SDDGAN和SDNet的结果包含了这种结构,但它们有点模糊或被噪声污染。只有我们的方法生成的融合图像在清晰度和亮度上都接近原始红外图像。由FusionGAN、SDNet、GANMcC和U2Fusion制作的图像都显示出颜色扭曲,例如,绿色盒子里的白色车辆看起来是绿色的。总之,
该方法通过从多通道数据中提取互补信息,仍然可以保持可见图像的颜色保真度和红外图像的微弱信息
我们将所提出的方法与六种最先进的方法进行了定量比较。图9显示了在MSRS数据集上的6个统计指标的定量结果。
本文方法在五个指标(即MI、VIF、Qabf、SD和Delta E)中显示出了显著的好处
。最高的MI表明,我们的方法成功地将最多的信息从多通道源图像传输到融合图像。最佳的VIF表明,发散融合生成的融合图像更符合人类视觉系统。我们的发散融合显示出最好的Qabf,因此保持了更多的边缘信息。此外,该方法的SD最好,说明我们融合图像的对比度最大。此外,由于扩散模型利用了多通道互补信息,我们的方法在颜色保真度指标(Delta E)方面明显高于比较方法。在SF度量中,该方法仅略低于SDDGAN和TarDAL。
在RoadScene和M3FD数据集上,测试了在MSRS数据集上训练的模型,以评估泛化性能
。在这两个数据集上也进行了测试。我们从每个数据集中选择了一个例子来研究。图10来自于道路场景的数据集。
可见光图像主要由道路、树木、车辆和天空组成,而红外图像则突出了汽车的下部和部分路面
。虽然使用各种方法融合的图像中红外图像中的明亮区域得到了一定程度的保留,但FusionGAN、GANMCC、SDDGAN和SDNet融合的图像中天空和树木的颜色发生了显著变化。U2Fusion和TarDAL生成的图像颜色失真较小,但输出模糊,缺乏重要的结构信息(如树冠)。
相比之下,本文的融合图像有效地保留了红外图像中的显著信息,同时保持了可见图像中突出区域(如天空和树木)的颜色和纹理。在红色的矩形中,一辆货车的尾部被放大了。在由FusionGAN、GANMcC、SDDGAN、SDNet、U2Fusion和TarDAL创建的融合图像中,车厢和车轮的轮廓混乱而杂乱。
只有我们的结果保留了可见图像中的区域的颜色和结构细节。这一现象证明了该方法提取互补信息的能力,以及它在纹理和颜色保存方面的优势
。
从M3FD数据集中选择了一个地下车库场景进行定性分析,如图11所示,在红外图像中突出显示了管道结构和背景墙。首先,TarDAL和我们的方法产生的融合图像在整体感知方面与原始可见图像非常相似。由于互补信息的不当组合不当,FusionGAN、SDNet、U2Fusion将可见图像中的柱的亮度替换为红外图像的亮度,导致图像右侧的柱过暗。GANMcC、SDDGAN和TarDAL部分缓解了这一问题。在复合图像中,柱子保留了原始可见图像的一些纹理和颜色信息,但不如所提出的方法有效。另外,SDDGAN和TarDAL遇到了与图7相同的问题,即亮度增强过高,导致壁面结构信息的丢失。原始可见图像中的反射角罩由红色矩形表示并放大。只有
我们的融合的图像保留了标志的颜色和结构细节,同时保持亮度
。
以上分析结果表明,该方法具有较强的泛化能力。它可以从不同场景中的多模态数据中挖掘互补信息,具有良好的纹理和颜色保留能力。
我们从MSRS数据集以外的两个数据集中选择25对图像,以定量评价该方法的泛化性能。表I和表II显示了M3FD和RoadScene数据集上的6个统计指标与6种最先进的方法的定量结果。如表I所示,我们可以看到Dif-Fusion在M3FD数据集上的6个指标中排名第一。实验结果表明,该方法生成的融合图像具有丰富的纹理细节、最高的对比度和最佳的视觉质量。根据表二,在道路场景数据集上,Dif-融合方法在VIF、Qabf和Delta E方面都优于比较的方法。此外,Dif-Fusion在M3FD和道路场景数据集的DeltaE中排名第一,这意味着该方法可以在保证信息量的同时提高颜色保真度。
该框架利用多通道互补信息提高了色彩保护精度和视觉质量。
为了验证扩散模型的有效性,我们消除了扩散过程
。更具体地说,保持了原始的网络结构,但去掉了扩散过程。在表三中总结了消融研究的结果。在MSRS数据集中,在去除扩散过程后,我们的方法在5个指标(即MI、VIF、SF、Qabf和Delta E)上的性能下降。在M3FD数据集和RoadScene数据集上,在去除扩散过程后,我们的方法在所有六个指标上的性能都有所下降。值得注意的是,在M3FD数据集中,去除扩散过程后,颜色保真度显著下降,说明多通道信息的分布和多通道互补信息的提取在颜色保存中起着非常重要的作用。
本文提出了一种基于扩散模型的红外和可见图像融合方法,以实现多通道互补信息提取和有效地保持色彩和视觉质量。
一方面,利用正向和反向扩散过程构造了多通道在潜在空间中输入数据的分布
。通过训练反过程中的去噪网络来预测前向过程中加入的高斯噪声,建立了多通道数据的分布。另一方面,
提出了一种直接生成三通道图像的方法
。为了直接保持三通道图像的梯度和强度,提出了多通道梯度和强度损失。融合图像评价方面,除了现有的
纹理和强度保真度指标外,我们还引入了Delta E来量化颜色保真度
。总体上,我们研究了一个基于扩散模型提取多通道互补信息的框架,并试图直接从多模态输入中生成彩色融合图像。
颜色在人类的视觉感知中起着重要的作用,反映了物体的光谱。然而,现有的红外和可见光图像融合方法很少探索如何直接处理多光谱/通道数据,并实现较高的彩色保真度。本文提出了一种利用扩散模型diffusion来生成多通道输入数据的分布,提高了多源信息聚合的能力和颜色的保真度。具体来说,我们没有将现有的融合方法中的多通道图像转换为单通道数据,而是在潜在空间中创建了具有正向和反向扩散过程的去噪网络的多通道数据分布。然后,我们利用去噪网络提取具有可见光和红外信息的多通道扩散特征。最后,我们。
针对多光谱成像系统采集的织物图像的颜色色差分析问题, 提出了一种基于仿射变换与Levenberg-Marquardt (LM)算法的图像配准
方法
。从配准角度出发, 利用提出的配准
方法
将标样图像与打样图像配准后进行空间色差分析。多光谱系统采集的织物图像的形变, 包括平移、旋转、缩放和错切变换, 符合典型仿射变换模型。提出一种新的
方法
来估计仿射变换矩阵, 该
方法
对两幅图像的对数极坐标幅度谱积分曲线进行匹配, 将仿射变换矩阵求解转化为一个非线性最小二乘拟合问题, 进而利用LM算法搜寻最优参数值, 同时引入分块配准以得到更好的配准效果。实验结果表明, 与传统基于Fourier-Mellin配准算法和基于尺度不变特征变换的特征点配准算法相比, 提出的算法可获得更好的配准效果, 可有效解决具有周期性元素的织物图像配准问题, 有助于织物图像色差评估。
克隆此仓库并使用pip安装它:
git clone https://github.com/andrea-sk/lizard-checker.git
cd lizard-checker
pip install .
$
dif
-checker -h
usage:
dif
-checker [-h] AVRO_PATH CHECKS_FILE
posit
ion
al arguments:
AVRO_PATH Path of the folder containing .avro files from
DIF
pipeline
CHECKS_FILE .json file containing checks for feeds in AVRO_PATH
opt
ion
al arguments:
-h, --h
dif
f-cpp-judger
注意:这个项目目前正在开发中,存在一些安全问题。使用它需要您自担风险。
这是一个cpp教育的django项目。 我们可以写下一些cpp问题。 让用户上传他们的代码在服务器端编译和执行。
任何拉取请求都是受欢迎的。
Python
2.7
Django 1.7 或更高版本
Celery 3.1 + 和支持的代理之一
AngularJS 1.x
首先, git clone和cd到这个 repo
pip install -r requirements.txt
cp _/settings.py.sample _/settings.py
_/settings.py需要配置一些变量。
SECRET_KEY :请参阅
我们使用 facebook oauth 来认证用户,请参考
JUDGE_DIR :编译代码的 tmp 目录。
JUDGE_
机试题:现有远传设备上行传输原始报文如下,请按照报文解析说明,使用Java语言进行编程,实现对原始报文的解析并能够以键值对的形式输出数据类型名称和数据解析值。(鼓励使用多种语言)。 原始报文:68 11 02 11 11 01 50 00 01 02 0C 98 3B 02 00 00 10 0C 94 3C 72 78 28 00 0C 3A 79 35 83 01 0B 69 62 32 01 06 6D 00 DE 31 CC 25 00 0C 98 3B 03 00 00 10 0C 94 3C 72 78 28 00 0C 3A 19 34 83 01 0B 69 91 32 01 06 6D 00 C0 32 CC 25 00 0F 报文解析说明: 数据开始 68h 固定68h表示数据开始 设备 ID 11h 01h 11h 11h 01h 50h 00h 00h 01h 设备 ID 例110111110150000001 正累积流量 0Ch
DIF
:8位BCD码,瞬时值 94h VIF:有副VIF,单位 0.01 m³ 3Bh VIFE:正向流量 78h 56h 34h 12h 123456.78 m³ 负累积流量 0Ch
DIF
:8位BCD码,瞬时值 94h VIF:有副VIF,单位 0.01 m³ 3Ch VIFE:反向流量 78h 56h 34h 12h 123456.78 m³ 水温 0Bh
DIF
:6位BCD码,瞬时值 59h VIF:进水温度,单位 0.01℃ 56h 34h 12h 1234.56℃ 瞬时流量 0Ch
DIF
:8位BCD码,瞬时值 3Ah VIF:体积流量(单位:1/10000 m³/h) 78h 56h 34h 12h 1234.5678 m³/h 负瞬时流量 0Ch
DIF
:8位BCD码,瞬时值 3Bh VIF:体积流量(单位:1/10000 m³/h) 78h 56h 34h 12h -1234.5678 m³/h 压力 0Bh
DIF
:6位BCD码,瞬时值 69h VIF:压力(单位:1/100bar = 1kPa) 56h 34h 12h 1234.56 kPa 累积运行时间 0Ch
DIF
:8位BCD码,瞬时值 26h VIF:工作时间(单位:h) 78h 56h 34h 12h 12345678h 实际日期时间 06h
DIF
:F 型数据,瞬时值 6Dh VIF:日期时间 0C 0E 30 87 28 00 2020-08-07T16:14:12Z 数据结束 0Fh 固定0F表示数据结束 注: 1、表中标红部分为设备可能上传的所有数据类型,但是所有数据数据类型不一定在一条报文中同时上传,而且在原始报文中数据类型也不一定按照表中顺序排列。 2、表中的实际日期时间,第一字节(标红部分)0C为秒,中间四个字节按下图解析,最后一个字节代表时区,下图为国标26831截图。
首先,您需要了解报文中各部分的含义,这样才能更好地进行解析。接下来,您需要遍历原始报文的每一个字节,并根据报文解析说明中的信息来解析数据。
例如,您可以创建一个类来表示一个数据项,并使用报文解析说明中的信息来解析数据。
您可以使用Java中的位运算符来解析BCD编码的数据,并使用Java中的数学函数(如pow())来计算单位转换。
例如,要解析8位BCD编码的数据,您可以使用以下代码:
int bcd = originalMessage[i];
int value = 0;
for (int j = 0; j < 8; j++) {
int digit = bcd & 0x0F;
value += digit * Math.pow(10, j);
bcd >>= 4;
您还需要根据VIF和VIFE字段来确定单位,并对数据进行单位转换。
最后,您可以使用Java中的HashMap类来存储键值对,并使用put()
方法
向其中添加键值对。
HashMap<String, String> data = new HashMap<>();
data.put("正累积流量", value + " m³");
然后,您可以使用get()
方法
来获取键值对的值。
String flow = data.get("正累积流量");
这就是使用Java来解析原始报文