一个很简单的练习,对一个80个波段的高光谱遥感图像进行监督分类。
总体思路是:①在图片中选出训练集与测试集,训练出ELM模型,通过精度评价不断调整参数;②把全部图像加载到模型中,得到分类输出Y;③把Y还原成图像,与原图进行对比。

一、 获得训练集与测试集

①在ENVI/ROI中选出一些样本并进行分类

深度学习遥感图像分类代码 遥感图像分类新方法_深度学习遥感图像分类代码

②将其输出,得到TXT形式的数据。

深度学习遥感图像分类代码 遥感图像分类新方法_数据_02


深度学习遥感图像分类代码 遥感图像分类新方法_数据_03


一共分了多少类,就输出多少次TXT,每次只输出一类。

③将数据导入matlab

这里可以先将所有数据导入matlab,再给所有数据标记类标1234,也可以先将数据导入Excel,对所有数据标记完类标1234后再导入matlab。

用代码data1=importdata('XX.TXT');最后得到如图的数据。

深度学习遥感图像分类代码 遥感图像分类新方法_归一化_04


深度学习遥感图像分类代码 遥感图像分类新方法_深度学习遥感图像分类代码_05


81是因为80个波段+1个分类

④对数据进行预处理

对所有数据进行均值归一化处理:
for i=1:size(dataset,2)-1;%减1是因为最后一列是类标 dataset(:,i)=(dataset(:,i)-min(dataset(:,i)))/(max(dataset(:,i))-min(dataset(:,i)))*2-1; end 这个预处理在黄广斌老师的主页有开源代码,下面用到的ELM代码也是黄老师主页上下载的开源代码。

二、 训练ELM模型

这个没啥技术含量,化身调参侠,去网上下好代码,调调参数Number_of_HiddenNeurons就OK,

三、把全部图像放入模型中

①导入全部图像数据

把TIFF文件拖入matlab,注意,一定要是TIFF文件。拖入后会看到如下提示,点击完成即可

深度学习遥感图像分类代码 遥感图像分类新方法_数据_06


这时候要注意,导入后得到了一个17853180的矩阵,为了方便处理,需要把这个矩阵拉成一个(178*531)*80的矩阵,temps=reshape(area,size(area,1)*size(area,2),size(area,3));

注意,这里得到的(178*531)*80矩阵是unit16型,即属于0~2^16-1的整数,整数!整数!!整数!!!导致在对这组数据进行均值归一化处理时结果会自动取整,从而出现错误。因此,要使用dataset=double(temps);把它们变成double型(我在百度这个问题时,有大佬说double后可能会出现精度误差,我也没看太懂,好奇的宝宝们可以自己去查一下)。

②数据处理

直接上代码

temps=reshape(area,size(area,1)*size(area,2),size(area,3));
dataset=double(temps);
for i=1:size(dataset,2)
        dataset(:,i)=(dataset(:,i)-min(dataset(:,i)))/(max(dataset(:,i))-min(dataset(:,i)))*2-1;
    end   

P=dataset;

%InputWeight与OutputWeight由调试后的模型得到

NumberofTrainingData=size(P',2);   
ind=ones(1,NumberofTrainingData);     
BiasMatrix=BiasofHiddenNeurons(:,ind);% 扩展BiasMatrix矩阵大小与H匹配      
tempH=InputWeight*P';                
tempH=tempH+BiasMatrix;               
H = 1 ./ (1 + exp(-tempH));
Y=(H' * OutputWeight)';
predict=zeros(size(P,1),1);

 for i = 1 : size(P,1);
[x,pre]=max(Y(:,i));
predict(i,1)=pre;
   end

得到结果应该是一个(178*531)*1的矩阵。

如果把三维数据M✖N✖D挨个像素输入模型的话,得到的类标是M✖N的。为便于处理,实际输入的数据是(MN)✖D的,因此输出的类标是(MN)的,需要把这个(MN)的向量转换成M✖N的矩阵。把m✖n✖d变成mn✖d是为了方便处理,但它的意义没有变。最后的输出应该是M✖N✖1的形式,而不是MN✖1的形式。因此需要把上述矩阵转化成178✖531✖1的,具体代码为:Pre=reshape(predict,size(area,1),size(area,2));

四、还原图像

把Pre这个矩阵用matlab画出来即可