我有一套BP神经网络遥感图像分类的代码,然后我一开始用的是公共数据源的tif文件以及样区tf文件,是可以完全实现的。后期我把公共数据源换成自己的研究数据图像,分类图就出现错误,公共数据源的图像与我的研究数据格式完全相同,明明都是tif文件为啥换个数据就不行了呢??希望得到大家的解答,实在找不到问题,有遇到相同情况的小伙伴吗?
以下为源代码:
clear all;
clc;
%%<----------------------------BPnetwork算法进行遥感图像分类------------------------
%% 读入样本图像1
Y= imread('D:\七类地物样本区.tif');
unique(Y)%查看矩阵中包含的数字种类
%读入待分类遥感图像
I=imread("D:\待分类影像.tif")
%% 输入影像降维
%将彩色图像降维
R=I(:,:,1);
G=I(:,:,2);
B=I(:,:,3);
%将矩阵转化为双精度
R=im2double(R);
G=im2double(G);
B=im2double(B);
%% 处理输入影像
[M,N]=size(R);
P=[R;G;B];
a1=1;a2=1;a3=1;a4=1;a5=1;a6=1;a7=1;a8=1;
for i = 1 : M
for j = 1 : N
if (Y(i,j)==1)
T1(:,a1) = I(i,j,:);
a1=a1+1;
elseif (Y(i,j)==2)
T2(:,a2) = I(i,j,:);
a2=a2+1;
elseif (Y(i,j)==3)
T3(:,a3) = I(i,j,:);
a3=a3+1;
elseif (Y(i,j)==4)
T4(:,a4) = I(i,j,:);
a4=a4+1;
elseif (Y(i,j)==5)
T5(:,a5) = I(i,j,:);
a5=a5+1;
elseif (Y(i,j)==6)
T6(:,a6) = I(i,j,:);
a6=a6+1;
elseif (Y(i,j)==7)
T7(:,a7) = I(i,j,:);
a7=a7+1;
elseif (Y(i,j)==8)
T8(:,a8) = I(i,j,:);
a8=a8+1;
end
end
end
T1 = im2double(T1);
T2 = im2double(T2);
T3 = im2double(T3);
T4 = im2double(T4);
T5 = im2double(T5);
T6 = im2double(T6);
T7 = im2double(T7);
P=[T1,T2,T3,T4,T5,T6,T7]; %样区数据
% 输入训练矩阵P归一化
R1=P(1,:);
G1=P(2,:);
B1=P(3,:);
R1=mapminmax(R1, 0, 1);
G1=mapminmax(G1, 0, 1);
B1=mapminmax(B1, 0, 1);
P=[R1;G1;B1];
ismember(1,P)%判断1是否在R中
ismember(0,P)%判断1是否在R中
%% 处理T
% T=eye(8)
[a,b]=size(P);
T=zeros(7,b); %注意修改行数——标记结果
T(1,1:a1-1)=1;
T(2,a1:a1+a2-2)=1;
T(3,a1+a2-1:a1+a2+a3-3)=1;
T(4,a1+a2+a3-2:a1+a2+a3+a4-4)=1;
T(5,a1+a2+a3+a4-3:a1+a2+a3+a4+a5-5)=1;
T(6,a1+a2+a3+a4+a5-4:a1+a2+a3+a4+a5+a6-6)=1;
T(7,a1+a2+a3+a4+a5+a6-5:a1+a2+a3+a4+a5+a6+a7-7)=1;
% T(8,a1+a2+a3+a4+a5+a6+a7-6:a1+a2+a3+a4+a5+a6+a7+a8-8)=1;
%% 训练模型
%建立BP网络,中间层8,输出层3,tansig、purelin分别为中间层、输出层的转换函数,
tic;%开始计时
echo on
net=newff(P,T,[10],{'tansig','purelin'},'traingd');
clc
%设置训练参数
net.trainparam.show=10;
net.trainParam.epochs=100;
net.trainParam.goal=0.001;
net.trainParam.lr=0.01;%学习率
net=init(net);%重新初始化
net.divideFcn = '';
[net,tr]=train(net,P,T);
%% 处理代分类影像
%将彩色图像降维
R=I(:,:,1);
G=I(:,:,2);
B=I(:,:,3);
%输入矩阵转化为双精度
R=im2double(R);
G=im2double(G);
B=im2double(B);
%%
[M,N]=size(R);
R=reshape(R',[1 M*N]);
G=reshape(G',[1 M*N]);
B=reshape(B',[1 M*N]);
%% 输入矩阵归一化
R = mapminmax(R, 0, 1); % 归一化。
G = mapminmax(G, 0, 1);
B = mapminmax(B, 0, 1);
X=[R;G;B];
ismember(1,X)%判断1是否在R中
ismember(0,X)%判断1是否在R中
%% 对BP网络进行仿真
IN=sim(net,X);
[max_IN,index]=max(IN);%max_IN最大值数值,index每列最大值所在位置
OUT=index;
Pic=reshape(OUT,M,N);
%% 显示
Pic=uint8(Pic);
Pic= flipud(Pic);%左右翻转
%设置颜色
imagesc(Pic);
colormap(gca,jet);
colorbar
%翻转图像
view(90,90);
title('分类图');
toc;%结束计时
%% 导出文件
% %导出文件
% imwrite(uint8(Pic),'C:\Users\10744\Desktop\39image.tif','tif');
% %检查导出文件
% Test= imread('C:\Users\10744\Desktop\39image.tif');
% unique(Test);

