高光谱经典异常目标检测算法CEM实现

本文主要介绍高光谱数据特点以及对应的目标处理算法CEM

一. 高光谱数据介绍

高光谱数据是一种遥感数据,其特点在于能够以高精度获取连续波长范围内的光谱信息,它通常用于地球观测、农业、环境监测、矿产勘探等领域。相较于普通图像数据,它不仅记录了物体的外观和形状,还包含了物体反射或辐射的详细光谱特征。这使得高光谱数据在许多领域如农业、环境监测和矿产勘探中具有独特的应用优势。与传统图像不同,高光谱数据允许更精细的物体分类、土壤和植被健康的监测,以及矿物质的识别,因为它提供了更多波段和光谱信息,可以揭示不同物质的光学特性和组成。

二. 高光谱图像处理之目标检测

20世纪80年代末,美国的一些研究机构开始利用高光谱图像数据进行目标检测方面的研究。自上世纪九十年代,国外出现了进行高光谱图像目标检测算法理论研究的研究组。由ReedYu提出了基于广义似然比检验的恒虚警RX 检测器(RXD)Chang课题组提出了基于正交子空间投影的OSP检测方法, Harsanyi提出了基于约束能量最小化的CEM算法。未来高光谱目标检测的发展将会越来越重视实用性,算法的性能将会进一步提高,同时更也加适合使用FPGA硬件对其进行加速从而具有更高的实际应用价值。高光谱目标检测具有较强的实用性,可应用于公共安全、环境检测、城市规划、食品卫生、地质岩矿的识别等众多方面。

三. 高光谱图像数据特点

高光谱图像数据“图谱合一”,具有丰富的光谱维信息。高光谱图像数据共有三个维度,如图2.1所示,其中,图像空间维信息xy用于表示物体的实际空间分布,而光谱波段L用于表示每个像素的光谱属性。高光谱图像的各波段在成像范围内都是连续成像,因此高光谱的光谱曲线一般是平滑的、连续的曲线。高光谱图像的波段L中涵盖了物质的光谱信息,而每种物质的光谱信息都不一样,我们可以利用图像像素的光谱波段L所包含的特定的光谱信息来判断该像素所代表的特定的物质种类。如图所示,对于拍摄得到的原始高光谱图像数据,需要先对数据进行预处理,包括数据格式化、无用数据剔除以及亮度到反射率的转化等。同时,对于遥感仪拍摄的高光谱图像还需要进行辐射校正,在目标检测前,应对数据进行调整,包括数据归一化等。最后根据已知的先验信息选择相应的目标检测算法进行检测。


高光谱图像数据结构

四. 高光谱图像处理算法CEM

1、算法步骤:

1)对高光谱图像进行预处理,得到二维化和归一化后的数据rL*N);

2)根据图像数据r,求得图像的自相关矩阵:

3)确定目标光谱向量dd大小为L*1);

4)设计FIR线性滤波器

5)将归一化后的数据经过FIR滤波器,得到输出信号y

attachments-2024-01-SSzr1Ct165ae921213e68.jpg

CEM算法分解流程图

如图所示,首先根据高光谱图像r求得自相关矩阵,再利用矩阵求逆模块求得自相关矩阵的逆矩阵,结合从光谱库获取到的目标向量的先验信息求得FIR滤波器的滤波向量,最后将高光谱图像r通过FIR滤波器即可得到最终的检测结果。

2CEM算法实现

 对前期得到的高光谱图像在MATLAB平台上进行预处理。这一过程主要对原始的200*200*189大小的高光谱图像进行操作:

1)二维化:通过调用MATLAB里面的reshape()函数实现。

2)归一化:采用“min-max”方法。 具体步骤是先找到数据的最大值

maxA)和最小值(minA), 通过 y = (x-minA) /(maxA-minA) 计算的 y 即为归一化后的数据。高光谱数据量大,也造成了数据的存储比较困难,数据在程序中的存储等处理

3CEM算法的MATLAB实现:

首先,对高光谱图像数据进行预处理,而后求其自相关矩阵。高光谱图像数据的大小为200*200*189,其中200*200为像素数,189为波段数。首先用reshape()函数和transpose()函数将200*200*189的三维高光谱图像数据转为189*40000的二维矩阵,再用自己写的Normalize()函数对矩阵数据用“min-max”方法进行归一化,然后根据公式式利用MATLAB中的矩阵求转置函数transpose()和矩阵相乘操作得到一个189*189的矩阵,最后对189*189的矩阵除以像素数N即可得到自相关矩阵。最后,根据先验已知的目标向量和自相关矩阵R的逆矩阵(在MATLAB中矩阵R求逆即为(1/R))求得FIR滤波器,将高光谱图像模拟数据通过FIR滤波器,即可得到最终的检测结果。

matlab代码如下:

function Zcem = CEM(HIM, d)
    [x, y, z] = size(HIM);
    R = zeros(z);
    r = reshape(HIM, x*y, z);
    r = transpose(r);
    R = r*r';
    R = R/(x*y);
    w = (R\d)/(transpose(d)*(R\d));
    for i = 1:x*y
        Z(i) = transpose(w)*r(:,i);
    end
    Zcem = reshape(Z,x,y);
    Zcem = abs(Zcem);
end

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
LH
LH

14 篇文章

作家榜 »

  1. Panda-admin 37 文章
  2. 解弘艺 17 文章
  3. 高曾谊 16 文章
  4. 旺仔牛奶opo 15 文章
  5. 胡中天 14 文章
  6. LH 14 文章
  7. 罗柏荣 13 文章
  8. 林晨 12 文章