%% 清空环境空间
close all;
clear all;
clc;
%% 读取图像(13个波段)
pic=imread('fusion1.tif');
%% 加载数据(每个数据都只选用800个数据)
%针对building1,tree1......water1等ROI数据,需要把分类数据加载
%但是对于building,tree.....water等truth_ROI数据,只要选择其对应标签的X,Y,但是要注意ENVI里面的坐标与MATLAB里面坐标的转换【用于计算accuracy和Kappa系数】
load('buildingtrain.mat');load('treetrain.mat');load('roadtrain.mat');
load('grasstrain.mat');load('soiltrain.mat');load('watertrain.mat');
%% 选定训练集合进行测试[对数据进行归一化]
%加载训练集合(就是truth_ROI,利用truth_ROI预测出predict_label_t)
TrainData_building=buildingtrain(1:800,:);
TrainData_tree=treetrain(1:800,:);
TrainData_road=roadtrain(1:800,:);
TrainData_grass=grasstrain(1:800,:);
TrainData_soil=soiltrain(1:800,:);
TrainData_water=watertrain(1:800,:);
A=800;%size(TrainData_tree)=800
%确定训练集和训练标签
pic1(1:A,1) = 1;
pic2(1:A,1) = 2;
pic3(1:A,1) = 3;
pic4(1:A,1) = 4;
pic5(1:A,1) = 5;
pic6(1:A,1) = 6;
Train_label=[pic1;pic2;pic3;pic4;pic5;pic6];
TrainData=[TrainData_building;TrainData_tree;TrainData_road;TrainData_grass;TrainData_soil;TrainData_water];
%等到测试集找出每一列的最大最小值,再进行标准化
% Train_data=normalized(TrainData);
%确定测试集和测试标签
[X,Y,P]=size(pic);%因为是13个波段,P=13
a1=im2double(pic(:,:,1));a2=im2double(pic(:,:,2));a3=im2double(pic(:,:,3));a4=im2double(pic(:,:,4));a5=im2double(pic(:,:,5));a6=im2double(pic(:,:,6));a7=im2double(pic(:,:,7));a8=im2double(pic(:,:,8));a9=im2double(pic(:,:,9));
a10=im2double(pic(:,:,10));a11=im2double(pic(:,:,11));a12=im2double(pic(:,:,12));a13=im2double(pic(:,:,13));a14=im2double(pic(:,:,14));a15=im2double(pic(:,:,15));a16=im2double(pic(:,:,16));a17=im2double(pic(:,:,17));a18=im2double(pic(:,:,18));a19=im2double(pic(:,:,19));
a20=im2double(pic(:,:,20));a21=im2double(pic(:,:,21));a22=im2double(pic(:,:,22));a23=im2double(pic(:,:,23));a24=im2double(pic(:,:,24));a25=im2double(pic(:,:,25));a26=im2double(pic(:,:,26));a27=im2double(pic(:,:,27));a28=im2double(pic(:,:,28));a29=im2double(pic(:,:,29));
a30=im2double(pic(:,:,30));a31=im2double(pic(:,:,31));a32=im2double(pic(:,:,32));a33=im2double(pic(:,:,33));a34=im2double(pic(:,:,34));a35=im2double(pic(:,:,35));a36=im2double(pic(:,:,36));a37=im2double(pic(:,:,37));a38=im2double(pic(:,:,38));a39=im2double(pic(:,:,39));%将pic的每个图层分开
TestData=zeros(X*Y,13,'double');
K=1;
for i=1:X
for j=1:Y
TestData(K,1)=a1(i,j);
TestData(K,2)=a2(i,j);
TestData(K,3)=a3(i,j);
TestData(K,4)=a4(i,j);
TestData(K,5)=a5(i,j);
TestData(K,6)=a6(i,j);
TestData(K,7)=a7(i,j);
TestData(K,8)=a8(i,j);
TestData(K,9)=a9(i,j);
TestData(K,10)=a10(i,j);
TestData(K,11)=a11(i,j);
TestData(K,12)=a12(i,j);
TestData(K,13)=a13(i,j);
TestData(K,14)=a14(i,j);
TestData(K,14)=a15(i,j);
TestData(K,16)=a16(i,j);
TestData(K,17)=a17(i,j);
TestData(K,18)=a18(i,j);
TestData(K,19)=a19(i,j);
TestData(K,20)=a20(i,j);
TestData(K,21)=a21(i,j);
TestData(K,22)=a22(i,j);
TestData(K,23)=a23(i,j);
TestData(K,24)=a24(i,j);
TestData(K,25)=a25(i,j);
TestData(K,26)=a26(i,j);
TestData(K,27)=a27(i,j);
TestData(K,28)=a28(i,j);
TestData(K,29)=a29(i,j);
TestData(K,30)=a30(i,j);
TestData(K,31)=a31(i,j);
TestData(K,32)=a32(i,j);
TestData(K,33)=a33(i,j);
TestData(K,34)=a34(i,j);
TestData(K,35)=a35(i,j);
TestData(K,36)=a36(i,j);
TestData(K,37)=a37(i,j);
TestData(K,38)=a38(i,j);
TestData(K,39)=a39(i,j);
K=K+1;
end
end
Max=max(TestData);
Min=min(TestData);
%此处插入:TrainData的归一化。
Train_data=normalized(TrainData,Max,Min);
Test_data=normalized(TestData,Max,Min);
Test_data(isnan(Test_data))=0; %将测试数据中的空值赋值为0
Test_data(Test_data==inf)=0; %将测试数据中的无穷大值赋值为0
Train_data(isnan(Train_data))=0;
Train_data(Train_data==inf)=0;
A=length(Test_data)-2;
Test_label = [ones(A/6,1);2*ones(A/6,1);3*ones(A/6,1);4*ones(A/6,1);5*ones(A/6,1);6*ones(A/6,1);6;6];
%% 建模预测
%此时只是为了出图,得到predict_label
%利用训练集合建立分类模型
model = svmtrain(Train_label,Train_data,'-c 1 -g 0.2 b 1');
[predict_label,accuracy,decision_values] = svmpredict(Test_label,Test_data,model);
%只是为了得到predict_label,目的是可以:出图!
%% 分类可视化
result=zeros(X,Y,3); % RGB彩图
for k=1:X*Y % R分量 G分量 B分量
if (predict_label(k,1)==1) Test_data(k,1)=255;Test_data(k,2)=0;Test_data(k,3)=0; % 红色【building】
elseif(predict_label(k,1)==2) Test_data(k,1)=0;Test_data(k,2)=139; Test_data(k,3)=0; % green3【tree】
elseif(predict_label(k,1)==3) Test_data(k,1)=0;Test_data(k,2)=0; Test_data(k,3)=255; % 蓝色【road】
elseif(predict_label(k,1)==4) Test_data(k,1)=0; Test_data(k,2)=238; Test_data(k,3)=0; % green1【grass】
elseif(predict_label(k,1)==5) Test_data(k,1)=139; Test_data(k,2)=90; Test_data(k,3)=0; % Orange4【soil】
elseif(predict_label(k,1)==6) Test_data(k,1)=0; Test_data(k,2)=0; Test_data(k,3)=0; % 黑色【water】
end
end
k=1;
for i = 1:X
for j=1:Y
result(i,j,1)=Test_data(k,1);
result(i,j,2)=Test_data(k,2);
result(i,j,3)=Test_data(k,3);
k=k+1;
end
end
result=uint8(result);
figure;
imshow(result);
%% 计算accuracy和Kappa系数
%加载building,tree.....water等truth_ROI数据,选择其对应标签的X,Y,但是要注意ENVI里面的坐标与MATLAB里面坐标的转换!(也只用800个数据)
load('building_XY.mat');load('tree_XY.mat');load('road_XY.mat');
load('grass_XY.mat');load('soil_XY.mat');load('water_XY.mat');
%ENVI和Matlab坐标转换:其实就是水平镜像,直接用内置函数fliplr
building_XY=fliplr(building_XY(1:800,:));%标签是1
tree_XY=fliplr(tree_XY(1:800,:));%标签是2
road_XY=fliplr(road_XY(1:800,:));%标签是3
grass_XY=fliplr(grass_XY(1:800,:));%标签是4
soil_XY=fliplr(soil_XY(1:800,:));%标签是5
water_XY=fliplr(water_XY(1:800,:));%标签是6
%将predict_label的多行一列改为上述对应的:X行Y列,存在新的数组:predict_label_t
predict_label_t=zeros(X,Y);
k=1;
for i=1:X
for j=1:Y
predict_label_t(i,j)=predict_label(k);
k=k+1;
end
end
%找出building_XY,tree_XY,......water_XY对应位置的predict_label_t中的标签
building1_label=zeros(800,1);tree1_label=zeros(800,1);road1_label=zeros(800,1);
grass1_label=zeros(800,1);soil1_label=zeros(800,1);water1_label=zeros(800,1);
for i=1:800
a1=building_XY(i,1);
b1=building_XY(i,2);
building1_label(i,1)=predict_label_t(a1,b1);
a2=tree_XY(i,1);
b2=tree_XY(i,2);
tree1_label(i,1)=predict_label_t(a2,b2);
a3=road_XY(i,1);
b3=road_XY(i,2);
road1_label(i,1)=predict_label_t(a3,b3);
a4=grass_XY(i,1);
b4=grass_XY(i,2);
grass1_label(i,1)=predict_label_t(a4,b4);
a5=soil_XY(i,1);
b5=soil_XY(i,2);
soil1_label(i,1)=predict_label_t(a5,b5);
a6=water_XY(i,1);
b6=water_XY(i,2);
water1_label(i,1)=predict_label_t(a6,b6);
end
predict_ROI_label=[building1_label;tree1_label;road1_label;grass1_label;soil1_label;water1_label];
truth_ROI_label=[ones(800,1);2*ones(800,1);3*ones(800,1);4*ones(800,1);5*ones(800,1);6*ones(800,1)];
%计算混淆矩阵
num_in_class=[800;800;800;800;800;800];
name_class=[1;2;3;4;5;6];%1-building;2-tree;3-road;4-grass;5-soil;6-water
[confusion_matrix]=compute_confusion_matrix(predict_ROI_label,num_in_class,name_class);
CT=sum(confusion_matrix,1);%列总和
RT=sum(confusion_matrix,2);%行总和
N=sum(sum(confusion_matrix));%总像素数量
PO=trace(confusion_matrix)/N;%总体分类精度
PC=1/N^2*sum(RT.*CT');
overall_accuracy=PO
Kappa=(PO-PC)/(1-PC);
Kappa
评论3