Spectral–spatial hyperspectral image classification

遥感影像的全色、多光谱、高光谱图像

遥感成像原理: 光进入相机镜头,光电感应装置将光信号转换为电信号,量化电脉冲信号,记录为一个像素值。传感器响应函数设计为,要使光电感应装置产生这个电脉冲信号,光子强度必须达到一个阈值。进入镜头的光子数量取决于相机的感受野大小,镜头能通过的光子。多光谱图像要分出多个波段,镜头会分光,红滤镜只过红光,蓝滤镜只通过蓝光,假设相同的光打到全色与多光谱镜头上,显然因为滤光的缘故,多光谱感光器接收到的光子要少于全色感光器。而这些光子已经足够全色产生电脉冲,却不够多光谱产生电脉冲,这时,为了接收到更多的光子,多光谱相机需要更大的感受野。
也就是说,全色看了一眼北京市,就吃够了光子,多光谱需要看一遍河北省,才能吃的和全色一样饱。后面接收光子的底片一样大,也就是说将北京市和河北省画到同样大小的一张纸上且占满整张纸,显然北京市的一张纸细节要多的多,而河北省的红绿蓝三张纸却一片模糊。

  • 全色
    全色图像是单通道的,其中全色是指全部可见光波段0.38~0.76 μ \mu μm,全色图像为这一波段范围的混合图像。因为是单波段,所以在图上显示为灰度图片。全色遥感图像一般空间分辨率高,但无法显示地物色彩,也就是图像的光谱信息少。
  • 多光谱
    多光谱图像是指对地物辐射中多个单波段的摄取,得到的影像数据中会有多个波段的光谱信息。若取其中RGB三个波段的信息显示,就是RGB彩色图像。一般文献显示出来的多光谱图像,其实是RGB三通道的图像。
    由于光谱信息其实也就对应了色彩信息,所以多波段遥感图像可以得到地物的色彩信息,但是空间分辨率较低。更进一步,光谱通道越多,其分辨物体的能力就越强,即光谱分辨率越高。
  • 高光谱
    高光谱是由很多通道组成的图像,具体有多少个通道,这需要看传感器的波长分辨率,每一个通道捕捉指定波长的光。把光谱想象成一条直线,由于波长分辨率的存在,每隔一定距离才能“看到”一个波长。“看到”这个波长就可以收集这个波长及其附近一个小范围的波段对应的信息,形成一个通道,也就是一个波段对应一个通道。如果我们进行对高光谱上某一个像素的采样,就可以针对此像素生成一个“光谱特征”。多光谱图像其实可以看做是高光谱图像的一种情况,即成像的波段数量比高光谱图像少,一般只有几个到十几个。
    国际遥感界的共识是光谱分辨率在 λ / 10 \lambda/10 λ/10 数量级范围的称为多光谱(Multispectral),这样的遥感器在可见光和近红外光谱区只有几个波段,如美国LandsatMSS,TM,法国的SPOT等;而光谱分辨率在 λ / 100 \lambda/100 λ/100的遥感信息称之为高光谱遥感 (HyPerspectral);随着遥感光谱分辨率的进一步提高,在达到 λ / 1000 \lambda/1000 λ/1000时,遥感即进入超高光谱(ultraspectral)阶段。

高光谱图像分类

不同物质在不同波段光谱信号下的不同表现,可以绘制成一条关于光谱波段和光谱值之间的曲线,根据曲线的差异,我们可以高光谱图像中不同物质进行分类。

Spectral–spatial hyperspectral image classification based on KNN

光谱与空间信息的融合是提高高光谱图像分类精度的有效途径。在本文中,提出了一种基于K最近邻(KNN)的光谱-空间高光谱图像分类方法,该方法包括以下步骤。首先采用支持向量机得到初始分类概率反映每个高光谱像素属于不同类别的概率的地图。然后,使用基于匹配和平均非局部邻域的 KNN 过滤算法对获得的逐像素概率图进行细化。所提出的方法不需要复杂的分割和优化策略,同时仍然能够通过使用KNN充分利用真实图像的非局部原理,从而提供具有竞争力的分类和快速计算。
在这里插入图片描述
近年来,人们发现在图像分析中融合光谱和空间信息可以进一步提高分类结果。 具体来说,基于该像素的特征向量和从像素邻域提取的特征值对高光谱像素进行分类。

已有工作及其缺陷
  • 局部处理技术:例如最近提出的基于边缘保留滤波的方法,只考虑局部邻域。 虽然可以使用不同尺度的滤波操作来定义局部邻域,但这种方法不能充分利用高光谱像素之间的深度和全局空间相关性。
  • 图像分割技术:虽然可以提高分类精度,但分割算法可能很耗时。
本文提出的方法
理论

考虑到局部处理技术的缺陷,本文提出了一种新的基于 KNN 的融合光谱和空间信息的方法。通过利用 KNN 来探索非局部的信息,而这种非局部性由以下公式体现:
F ( i ) = ( I ( i ) , λ ⋅ l ( i ) , λ ⋅ h ( i ) ) F(i)=(I(i), \lambda \cdot l(i), \lambda \cdot h(i)) F(i)=(I(i),λl(i),λh(i))
其中 I ( i ) I(i) I(i) 指的是归一化像素值, l ( i ) l(i) l(i) h ( i ) h(i) h(i) 分别指的是像素 i i i 的归一化经度和纬度。 k k k 控制 KNN 搜索过程中像素值和空间坐标之间的平衡。 F ( i ) F(i) F(i)就是利用空间信息和光谱信息生成的新的特征向量。

基于KNN的非局部滤波方法可定义如下:
O ( i ) = ∑ P ( j ) K , j ∈ ω i O(i)=\frac{\sum P(j)}{K}, j \in \omega_{i} O(i)=KP(j),jωi
式中, ω i \omega_i ωi是指使用新的特征空间 f ( i ) f(i) f(i)中像素点的 k k k个最近邻居, O ( i ) O(i) O(i)是过滤输出, P ( j ) P(j) P(j)是原图使用 SVM得到的估计的概率映射矩阵。
在这里插入图片描述
如上图所示,(a)为输入,(b)是引导图像,(c)是不利用空间信息的输出,(d)是利用了空间信息的输出。
通过对比(c)和(d)可以发现(d)的边界细节更加清晰。

步骤

在这里插入图片描述

如图所示,所提出的方法包括以下步骤

  • SVM 分类:对于 D D D维光谱图像 x = ( x 1 , … , x i ) ∈ R d × i x=\left(x_{1}, \ldots, x_{i}\right) \in \mathbb{R}^{d \times i} x=(x1,,xi)Rd×i τ \tau τ个训练样本。 T τ ≡ { ( x 1 , c 1 ) , … ( x τ , c τ ) } ∈ ( R d × L c ) τ T_{\tau} \equiv\left\{\left(x_{1}, c_{1}\right), \ldots\left(x_{\tau}, c_{\tau}\right)\right\} \in\left(\mathbb{R}^{\mathbb{d}} \times L_{c}\right)^{\tau} Tτ{(x1,c1),(xτ,cτ)}(Rd×Lc)τ。使用 SVM 对高光谱图执行逐像素分类。 L C = { 1 , … , N } L_{C}=\{1, \ldots, N\} LC={1,,N}为标签, N N N为分类的数量。
  • KNN 滤波:采用主成分分析法计算高光谱图像的一个波段表示得出引导图 I I I。然后基于公式(2)对每个类别 n 的初始概率图 P n P_n Pn执行 KNN 滤波。最后,通过给每个像素分配给出高概率标签,即可得出分类结果。其中主成分法采用第一主成分作为指导图,因为其给出了高光谱图像在均方意义上的最佳表示,包含大部分显著的信息。
结果
参数分析

在这里插入图片描述

如图所示,对于参数 K K K λ \lambda λ设置的太小,可能导致空间信息的利用不充分,设置太大又会导致过于平滑,从而大大降低准确率。因此选择合适的参数对与分类准确性有显著的影响,通过分析本文最终设置 K = 40 K=40 K=40 λ = 5 \lambda=5 λ=5

对比实验

在这里插入图片描述
在这里插入图片描述

结论
主要贡献
  • 第一个贡献是 KNN 搜索对图像进行非局部滤波的扩展,这充分利用相邻像素之间的空间相关性。
  • 第二个贡献是将基于 KNN 的滤波算法扩展到光谱-空间高光谱图像分类。
启发
  • 以后在构建新的想法的时候其实并不是一定要去使用最新、复杂的模型结构,有时候使用简单的模型也许有不一样的惊喜,就像本文一样仅仅使用简单的模型,就实现了较好的效果。
  • 我们可以通过原始的特征向量和一些我们想要的信息相组合,构建新的特征向量,例如本文,原始特征向量仅仅包含高光谱信息,然后利用空间的经纬度信息来对原始的特征向量进行升级,在新的特征向量的支持下,得到了更加优秀的分类结果。本文是直接对原始特征添加原本没有信息,采用这种做法的话就必须对数据集的详细属性进行分析,查看还缺少什么属性,不同的数据集所需要添加的信息可能有所不同。
  • 本文最后的分类结果,相当于使用了一个均值滤波,利用K近邻的预测的均值来重构自己的预测结构,采用这种方法的话,可以使边界的处理更加的清晰。
  • 对于初次预测本文使用的SVM,引导图像是利用PCA的得到的,在这两个步骤之中,是否可以把SVM换成其他的预测模型,把PCA换成其他的降维模型呢?我认为应该是可以的,但是最终会呈现出怎样的效果,还得需要具体去做实验。
抱歉,作为AI语言模型,我无法编写代码。但是,我可以解释Spectral-Spatial Convolution的原理和应用。 Spectral-Spatial Convolution是一种常用于图像和遥感图像处理的卷积神经网络(CNN)层。它结合了空间信息和频谱信息,将空间域和频域信息相互作用,从而可以更有效地提取图像特征。 在Spectral-Spatial Convolution中,每个卷积核包含两部分:空间卷积核和频谱卷积核。对于每个像素,空间卷积核在空间上滑动,频谱卷积核在频谱上滑动,两者在空间域和频域上的输出相互作用,得到最终的卷积结果。 以下是一个示例代码,展示了如何在PyTorch中实现Spectral-Spatial Convolution层: ``` import torch import torch.nn as nn import torch.nn.functional as F class SpectralSpatialConv(nn.Module): def __init__(self, in_channels, out_channels, kernel_size): super(SpectralSpatialConv, self).__init__() self.spatial_conv = nn.Conv2d(in_channels, out_channels, kernel_size) self.fft = torch.fft.fftn self.ifft = torch.fft.ifftn self.kernel_size = kernel_size self.out_channels = out_channels self.in_channels = in_channels self.weight = nn.Parameter(torch.Tensor(out_channels, in_channels, kernel_size, kernel_size)) self.reset_parameters() def reset_parameters(self): nn.init.kaiming_uniform_(self.weight, a=math.sqrt(5)) def forward(self, x): # Perform spatial convolution spatial_output = self.spatial_conv(x) # Perform spectral convolution fft_input = self.fft(x, dim=[2,3]) fft_kernel = self.fft(self.weight, dim=[2,3]) fft_output = torch.matmul(fft_input, fft_kernel) spectral_output = self.ifft(fft_output, dim=[2,3]).real # Combine spatial and spectral outputs output = spatial_output + spectral_output return output ``` 在这个例子中,我们定义了一个SpectralSpatialConv类,它继承了nn.Module类。在__init__方法中,我们定义了空间卷积和频谱卷积的卷积核,并初始化了权重。在forward方法中,我们首先进行空间卷积,然后进行频谱卷积,并将两个输出相加,得到最终的输出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值