⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bp.m

📁 利用bp神经网络对遥感图像进行分类
💻 M
字号:
clc;
clear;



%处理农田样本
crI=imread('CR.jpg');
crr=crI(:,:,1);crg=crI(:,:,2);crb=crI(:,:,3);%提取图像三个波段
crrr=im2double(crr);crgg=im2double(crg);crbb=im2double(crb);%将黑白图像转换成双精度格式并灰度值归一化为[0,1]之间
crro=[];
crgo=[];
crbo=[];
[crlen crlen2]=size(crrr);%计算rr矩阵的宽度和长度
crx=[];

%将矩阵转换成一维的矩阵
for i=1:crlen
    crro=[crro,crrr(i,:)];   %cat
end
for i=1:crlen
    crgo=[crgo,crgg(i,:)];
end
for i=1:crlen
    crbo=[crbo,crbb(i,:)];
end

crx=[crro;crgo;crbo];    %将三个波段的矩阵合并为一个矩阵


crlength=length(crx);

%处理海水样本
seaI=imread('sea.jpg');
sear=seaI(:,:,1);seag=seaI(:,:,2);seab=seaI(:,:,3);%提取图像三个波段
searr=im2double(sear);seagg=im2double(seag);seabb=im2double(seab);%将黑白图像转换成双精度格式并灰度值归一化为[0,1]之间
searo=[];
seago=[];
seabo=[];
[sealen sealen2]=size(searr);%计算rr矩阵的宽度和长度
seax=[];
seax1=[];
%将300*300的矩阵转换成一维的矩阵
for i=1:sealen
    searo=[searo,searr(i,:)];   %cat
end
for i=1:sealen
    seago=[seago,seagg(i,:)];
end
for i=1:sealen
    seabo=[seabo,seabb(i,:)];
end

seax=[searo;seago;seabo];    %将三个波段的矩阵合并为一个矩阵


sealength=length(seax);

%处理芦苇样本
reedI=imread('reed.jpg');
reedr=reedI(:,:,1);reedg=reedI(:,:,2);reedb=reedI(:,:,3);%提取图像三个波段
reedrr=im2double(reedr);reedgg=im2double(reedg);reedbb=im2double(reedb);%将黑白图像转换成双精度格式并灰度值归一化为[0,1]之间
reedro=[];
reedgo=[];
reedbo=[];
[reedlen reedlen2]=size(reedrr);%计算rr矩阵的宽度和长度
reedx=[];
reedx1=[];
%将矩阵转换成一维的矩阵
for i=1:reedlen
    reedro=[reedro,reedrr(i,:)];   %cat
end
for i=1:reedlen
    reedgo=[reedgo,reedgg(i,:)];
end
for i=1:reedlen
    reedbo=[reedbo,reedbb(i,:)];
end

reedx=[reedro;reedgo;reedbo];    %将三个波段的矩阵合并为一个矩阵


reedlength=length(reedx);

%处理绿地样本
grI=imread('GR.jpg');
grr=grI(:,:,1);grg=grI(:,:,2);grb=grI(:,:,3);%提取图像三个波段
grrr=im2double(grr);grgg=im2double(grg);grbb=im2double(grb);%将黑白图像转换成双精度格式并灰度值归一化为[0,1]之间
grro=[];
grgo=[];
grbo=[];
[grlen grlen2]=size(grrr);%计算rr矩阵的宽度和长度
grx=[];
grx1=[];
%将矩阵转换成一维的矩阵
for i=1:grlen
    grro=[grro,grrr(i,:)];   %cat
end
for i=1:grlen
    grgo=[grgo,grgg(i,:)];
end
for i=1:grlen
    grbo=[grbo,grbb(i,:)];
end

grx=[grro;grgo;grbo];    %将三个波段的矩阵合并为一个矩阵


grlength=length(grx);

%处理养殖场样本
culI=imread('cul.jpg');
culr=culI(:,:,1);culg=culI(:,:,2);culb=culI(:,:,3);%提取图像三个波段
culrr=im2double(culr);culgg=im2double(culg);culbb=im2double(culb);%将黑白图像转换成双精度格式并灰度值归一化为[0,1]之间
culro=[];
culgo=[];
culbo=[];
[cullen cullen2]=size(culrr);%计算rr矩阵的宽度和长度
culx=[];
culx1=[];
%将矩阵转换成一维的矩阵
for i=1:cullen
    culro=[culro,culrr(i,:)];   %cat
end
for i=1:cullen
    culgo=[culgo,culgg(i,:)];
end
for i=1:cullen
    culbo=[culbo,culbb(i,:)];
end

culx=[culro;culgo;culbo];    %将三个波段的矩阵合并为一个矩阵


cullength=length(culx);

%处理滩涂样本
mudI=imread('mudflat.jpg');
mudr=mudI(:,:,1);mudg=mudI(:,:,2);mudb=mudI(:,:,3);%提取图像三个波段
mudrr=im2double(mudr);mudgg=im2double(mudg);mudbb=im2double(mudb);%将黑白图像转换成双精度格式并灰度值归一化为[0,1]之间
mudro=[];
mudgo=[];
mudbo=[];
[mudlen mudlen2]=size(mudrr);%计算rr矩阵的宽度和长度
mudx=[];
mudx1=[];
%将矩阵转换成一维的矩阵
for i=1:mudlen
    mudro=[mudro,mudrr(i,:)];   %cat
end
for i=1:mudlen
    mudgo=[mudgo,mudgg(i,:)];
end
for i=1:mudlen
    mudbo=[mudbo,mudbb(i,:)];
end

mudx=[mudro;mudgo;mudbo];    %将三个波段的矩阵合并为一个矩阵


mudlength=length(mudx);

%处理互米花草样本
huI=imread('humi.jpg');
hur=huI(:,:,1);hug=huI(:,:,2);hub=huI(:,:,3);%提取图像三个波段
hurr=im2double(hur);hugg=im2double(hug);hubb=im2double(hub);%将黑白图像转换成双精度格式并灰度值归一化为[0,1]之间
huro=[];
hugo=[];
hubo=[];
[hulen hulen2]=size(hurr);%计算rr矩阵的宽度和长度
hulength=hulen*hulen2
hux=[];
hux1=[];
%将矩阵转换成一维的矩阵
for i=1:hulen
    huro=[huro,hurr(i,:)];   %cat
end
for i=1:hulen
    hugo=[hugo,hugg(i,:)];
end
for i=1:hulen
    hubo=[hubo,hubb(i,:)];
end

hux=[huro;hugo;hubo];    %将三个波段的矩阵合并为一个矩阵


hulength=length(hux);

%处理房屋样本
fwI=imread('fw.jpg');
fwr=fwI(:,:,1);fwg=fwI(:,:,2);fwb=fwI(:,:,3);%提取图像三个波段
fwrr=im2double(fwr);fwgg=im2double(fwg);fwbb=im2double(fwb);%将黑白图像转换成双精度格式并灰度值归一化为[0,1]之间
fwro=[];
fwgo=[];
fwbo=[];
[fwlen fwlen2]=size(fwrr);%计算rr矩阵的宽度和长度
fwx=[];
fwx1=[];
%将矩阵转换成一维的矩阵
for i=1:fwlen
    fwro=[fwro,fwrr(i,:)];   %cat
end
for i=1:fwlen
    fwgo=[fwgo,fwgg(i,:)];
end
for i=1:fwlen
    fwbo=[fwbo,fwbb(i,:)];
end
fwx=[fwro;fwgo;fwbo];    %将三个波段的矩阵合并为一个矩阵


fwlength=length(fwx);

%处理海三棱藨草的样本
sanI=imread('san.jpg');
sanr=sanI(:,:,1);sang=sanI(:,:,2);sanb=sanI(:,:,3);%提取图像三个波段
sanrr=im2double(sanr);sangg=im2double(sang);sanbb=im2double(sanb);%将黑白图像转换成双精度格式并灰度值归一化为[0,1]之间
sanro=[];
sango=[];
sanbo=[];
[sanlen sanlen2]=size(sanrr);%计算rr矩阵的宽度和长度
sanx=[];
sanx1=[];
%将矩阵转换成一维的矩阵
for i=1:sanlen
    sanro=[sanro,sanrr(i,:)];   %cat
end
for i=1:sanlen
    sango=[sango,sangg(i,:)];
end
for i=1:sanlen
    sanbo=[sanbo,sanbb(i,:)];
end

sanx=[sanro;sango;sanbo];    %将三个波段的矩阵合并为一个矩阵


sanlength=length(sanx);

%处理未利用土地的样本
unI=imread('un.jpg');
unr=unI(:,:,1);ung=unI(:,:,2);unb=unI(:,:,3);%提取图像三个波段
unrr=im2double(unr);ungg=im2double(ung);unbb=im2double(unb);%将黑白图像转换成双精度格式并灰度值归一化为[0,1]之间
unro=[];
ungo=[];
unbo=[];
[unlen unlen2]=size(unrr);%计算rr矩阵的宽度和长度
unx=[];
unx1=[];
%将矩阵转换成一维的矩阵
for i=1:unlen
    unro=[unro,unrr(i,:)];   %cat
end
for i=1:unlen
    ungo=[ungo,ungg(i,:)];
end
for i=1:unlen
    unbo=[unbo,unbb(i,:)];
end

unx=[unro;ungo;unbo];   %将三个波段的矩阵合并为一个矩阵

unlength=length(unx);

%将样本置于一个一维向量中
%
% P_G=[crgo,seago,reedgo,grgo,culgo,mudgo,hugo,fwgo,sango,ungo];
% P_B=[crbo,seabo,reedbo,grbo,culbo,mudbo,hubo,fwbo,sanbo,unbo];
% P=[P_RP_G,P_B];
 P=[crx,seax,reedx,grx,culx,mudx,hux,fwx,sanx,unx];



%设定目标向量,一维
T=[];
for i=1:100
    T(1,i)=0.1;
    T(2,i)=0.9;
    T(3,i)=0.1;
end
for i=101:200
    T(1,i)=0.2;
    T(2,i)=0.2;
    T(3,i)=0.9;
end
for i=201:300
    T(1,i)=0.9;
    T(2,i)=0.5;
    T(3,i)=0.2;
end
for i=301:400
    T(1,i)=0.6;
    T(2,i)=0.5;
    T(3,i)=0.7;
end
for i=401:464
    T(1,i)=0.3;
    T(2,i)=0.1;
    T(3,i)=0.1;
end
for i=465:564
    T(1,i)=0.8;
    T(2,i)=0.5;
    T(3,i)=0.1;
end
for i=565:664
    T(1,i)=0.4;
    T(2,i)=0.1;
    T(3,i)=0.7;
end
for i=665:764
    T(1,i)=0.5;
    T(2,i)=0.9;
    T(3,i)=0.9;
end
for i=765:864
    T(1,i)=0.25;
    T(2,i)=0.6;
    T(3,i)=0.9;
end
for i=865:964
    T(1,i)=0.7;
    T(2,i)=0.5;
    T(3,i)=0.1;
end


clc;
net=newcf(minmax(P),[15,3],{'tansig','purelin'},'traingdx');
%当前输入层权值和阈值
imputweights=net.iw{1,1}
inputbias=net.b{1}  %产生隐含层各神经元的阈值
%当前网路层权值和阈值 
layerweights=net.lw{2,1}
layerbias=net.b{2}

%设置训练参数
net.trainparam.show=50 %迭代50次显示一次
net.trainparam.lr=0.05 %学习率为0.05(一般大小在0-1之间)
net.trainparam.mc=0.9;  %动量因子0.9(0-1之间)
net.trainparam.epochs=1000;%迭代次数1000次
net.trainparam.goal=1e-3;%误差
clc
%调用traingdm算法训练bp网络
newnet=train(net,P,T);
clc
%仿真
I=imread('tm2000mask.jpg');

ro=I(:,:,1);
go=I(:,:,2); 
bo=I(:,:,3); 
rr=im2double(ro);%将r,g,b图像变为双精度格式,其灰度值归一到0,1之间
gg=im2double(go);
bb=im2double(bo);
[m,n]=size(rr)
%将图像变为一维向量形式
x=[];
for i=1:m
    x=[x,rr(i,:)];
end

y=[];
for i=1:m
    y=[y,gg(i,:)];
end

z=[];
for i=1:m
    z=[z,bb(i,:)];
end
tm=[x;y;z];
a=sim(newnet,tm);


rR=[];
R=[a(1,:)];
for i=0:779
   rR=[rR;R((i*1090+1):(i*1090)+1090)];
end



rG=[];
G=[a(2,:)];
for i=0:779
   rG=[rG;G((i*1090+1):(i*1090)+1090)];
end



rB=[];
B=[a(3,:)];
for i=0:779
   rB=[rB;B((i*1090+1):(i*1090)+1090)];
end
cr=0;
sea=0;
reed=0;
gr=0;
cul=0;
mud=0;
hu=0;
fw=0;
san=0;
un=0;
for i=1:780
 for j=1:1090
    if ((0.098<rR(i,j))&(rR(i,j)<0.12))
        cr=cr+1;
    else if ((0.19<rR(i,j))&(rR(i,j)<0.22))
            sea=sea+1;
        else if ((0.88<rR(i,j))&(rR(i,j)<0.92))
            reed=reed+1;
            else if ((0.58<rR(i,j))&(rR(i,j)<0.62))
                    gr=gr+1;
                else if ((0.28<rR(i,j))&(rR(i,j)<0.32))
                        cul=cul+1;
                    else if ((0.78<rR(i,j))&(rR(i,j)<0.82))
                            mud=mud+1;
                        else if ((0.38<rR(i,j))&(rR(i,j)<0.42))
                                hu=hu+1;
                            else if ((0.48<rR(i,j))&(rR(i,j)<0.52))
                                    fw=fw+1;
                                else if ((0.24<rR(i,j))&(rR(i,j)<0.26))
                                        san=san+1;
                                    else if ((0.68<rR(i,j))&(rR(i,j)<0.78))
                                            un=un+1;
                                        end
                                    end
                                end
                            end
                        end
                    end
                end
            end
        end
    end
 end
end
figure,pie([cr,sea,reed,gr,cul,mud,hu,fw,san,un]);
title('各类型土地利用比例图');
legend('农田','海水','芦苇','绿地','养殖场','滩涂','互米花草','房屋','海三棱藨草','未利用地');

%将数据转成0-255格式
R1=abs(rR)*255;
G1=abs(rG)*255;
B1=abs(rB)*255;
%转成彩图RGB格式显示
R2=uint8(R1);
G2=uint8(G1);
B2=uint8(B1);
RGB=cat(3,R2,G2,B2);
figure,imagesc(RGB);


disp('1--分类后红色波段图像');
disp('2--分类后绿色波段图像');
disp('3--分类后蓝色波段图像');
choice=input('请输入数字,对应要显示的图像:');
if choice==1
    figure,imshow(abs(rR))
else if choice==2
        figure,imshow(abs(rG))
    else if choice==3
            figure,imshow(abs(rB))
        end
    end
end




        
            
        

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -