JefferyWUUU 2023-03-28 19:14 采纳率: 0%
浏览 55
已结题

BP神经网络遥感图像分类问题

我有一套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);

img

img

  • 写回答

6条回答 默认 最新

  • 小逸2023 2023-03-28 19:26
    关注
    该回答引用ChatGPT
    根据您提供的代码和问题描述,可能出现问题的地方有以下几个方面:
    1. 数据格式问题:您提到公共数据源的图像与您的研究数据格式完全相同,但是实际上可能存在一些细微的差别,例如数据类型、数据范围等。建议使用MATLAB的imfinfo函数查看两个图像的详细信息,比较它们之间的差异。
    2. 样本区问题:您的代码中使用了样本区数据,这些数据可能与您的研究数据不匹配,导致分类错误。建议检查样本区数据是否与研究数据具有相同的空间分辨率、波段数等特征。
    3. 神经网络参数问题:您的代码中使用了BP神经网络进行分类,可能存在一些参数设置不当的问题。建议尝试调整神经网络的中间层数、学习率、迭代次数等参数,以获得更好的分类效果。
    4. 数据预处理问题:您的代码中对输入影像进行了降维和归一化处理,这些处理可能会影响分类结果。建议检查数据预处理的方法是否合理,是否存在潜在的问题。
    综上所述,您可以从以上几个方面入手,逐一排查问题,找到导致分类错误的原因。同时,建议在调试过程中添加一些输出语句,以便更好地理解程序的运行过程和结果。
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月1日
  • 修改了问题 3月28日
  • 创建了问题 3月28日