遥感影像监督分类与非监督分类及相关代码实现.docx
- 文档编号:30809543
- 上传时间:2024-01-30
- 格式:DOCX
- 页数:43
- 大小:227.19KB
遥感影像监督分类与非监督分类及相关代码实现.docx
《遥感影像监督分类与非监督分类及相关代码实现.docx》由会员分享,可在线阅读,更多相关《遥感影像监督分类与非监督分类及相关代码实现.docx(43页珍藏版)》请在冰豆网上搜索。
遥感影像监督分类与非监督分类
摘要:
遥感影像的分类方法按照是否有先验类别可分为监督分类和非监督分类,这两种分类方法有着本质的区别但也有存在一定的联系。
本文从分类原理和分类方法等不同角度分别介绍了监督分类和非监督分类方法,并对两种方法的分类结果进行了对比和分析。
关键词:
遥感;监督分类;非监督分类;ISODATA算法;贝叶斯分类算法。
1.数据来源
本文使用的数据是华盛顿广场上空由卫星拍摄的高光谱遥感影像。
该幅影像使用的传感器系统覆盖0.4到2.4m的可见光到近红外的210个波段。
由于0.9-1.4米光谱对应的区域上空大气透光性很差,因此将这个区域内的波段从影像中删除,最后得到191个波段。
该数据集有1208个扫描行,每行307个像元,容量近似150MB。
为了清晰地反映影像中地物的特征,本文从191个波段中选择了3个波段,分别是120、140和160。
下面两幅图分别是全波段影像和三波段影像:
图1全波段影像图2三波段影像
2.遥感影像的监督分类
2.1监督分类的原理
监督分类(supervisedclassification)又称训练场地法,是以建立统计识别函数为理论基础,依据典型样本训练方法进行分类的技术。
即根据已知训练区提供的样本,通过选择特征参数,求出特征参数作为决策规则,建立判别函数以对各待分类影像进行的图像分类,是模式识别的一种方法。
要求训练区域具有典型性和代表性。
判别准则若满足分类精度要求,则此准则成立;反之,需重新建立分类的决策规则,直至满足分类精度要求为止。
常用算法有:
最大释然分类法、最小距离分类法、马氏距离分类法、平行六面体分类法、K-NN分类法。
本文选用最大释然分类法对遥感影像进行监督分类。
最大似然判别法.也称为贝叶斯(Bayes)分类,是基于图像统计的监督分类法,也是典型的和应用最广的监督分类方法.它建立在Bayes准则的基础上,偏重于集群分布的统计特性,分类原理是假定训练样本数据在光谱空间的分布是服从高斯正态分布规律的,做出样本的概率密度等值线,确定分类,然后通过计算标本(像元)属于各组(类)的概率,将标本归属于概率最大的一组.用最大似然法分类,具体分为三步:
首先确定各类的训练样本,再根据训练样本计算各类的统计特征值,建立分类判别函数,最后逐点扫描影像各像元,将像元特征向量代入判别函数,求出其属于各类的概率,将待判断像元归属于最大判别函数值的一组。
2.2最大释然分类算法的调试
#include
#include
#include
#include
#include
constfloatPI=3.1415;
floattrain1[60][3],train2[60][3],train3[60][3],train4[60][3];//存各类训练样本
floatm1[3],m2[3],m3[3],m4[3],c1[3][3],c2[3][3],c3[3][3],c4[3][3];//各类均值向量及协方差矩阵
floatp=0.25;//先验概率
floattest[240][11];//检验样本各列分别存放:
分类前类别,行号,列号,一波段灰度,二波段灰度,三波段灰度,分类后类别
floata1,a2,a3,a4;//公式中常数项;
floatqq,qq1,qq2,qq3,qq4;//分类精度
floatk;//kappa值
intq[4][4];//混淆矩阵
floata[4][4];//精度指标矩阵各列分别为生产者精度漏分误差
//用户精度错分误差
intmain()
{
voidgetdata1(char*filename);
voidgetdata2(char*filename);
voidcompute(floattrain[60][3],floatm[3],floatc[3][3],float*a);
floatidentify(floatm[3],floatc[3][3],floata,floatband1,floatband2,floatband3);
intclassify(floatp1,floatp2,floatp3,floatp4);
voidtesting();
voidaccuracy(floatp[4][4]);
voidoutput(char*filename);
voidoutput1(char*filename);
getdata1("05training.txt");//存放的是训练样本三个波段的灰度值
getdata2("05testing.txt");//检验样本行号列号类别代码三个波段的灰度值
compute(train1,m1,c1,&a1);//计算各类均值向量及协方差矩阵
compute(train2,m2,c2,&a2);
compute(train3,m3,c3,&a3);
compute(train4,m4,c4,&a4);
testing();//对检验样本分类
accuracy(a);
output("05test-result.txt");
output1("05confusion-matrix.txt");
return0;
}
voidgetdata1(char*filename)
{
ifstreaminfile(filename,ios:
:
in|ios:
:
nocreate);//把每类样本的灰度值依次存入对应的数组
if(infile==0)
{cout<<"openinfileerror!
"< exit (1); } inti,j; for(i=0;i<60;i++) for(j=0;j<3;j++) infile>>train1[i][j]; for(i=0;i<60;i++) for(j=0;j<3;j++) infile>>train2[i][j]; for(i=0;i<60;i++) for(j=0;j<3;j++) infile>>train3[i][j]; for(i=0;i<60;i++) for(j=0;j<3;j++) infile>>train4[i][j]; infile.close(); } voidgetdata2(char*filename) { ifstreaminfile(filename,ios: : in|ios: : nocreate); if(infile==0) { cout<<"openinfileerror! "< exit (1); } inti,j; for(i=0;i<240;i++)//检验样本的数量为240 for(j=0;j<6;j++)//行、列号、类别代码、三个波段灰度值 infile>>test[i][j]; infile.close(); } voidcompute(floattrain[60][3],floatm[3],floatc[3][3],float*a) { voidgauss(intf,floatn[3][3]);//求n矩阵的逆阵声明 inti,j; for(i=0;i<3;i++)m[i]=0; for(i=0;i<3;i++) { for(j=0;j<60;j++) m[i]+=train[j][i]; m[i]=m[i]/60; } floatTrain[3][60];//转置矩阵 for(i=0;i<3;i++) for(j=0;j<60;j++) Train[i][j]=train[j][i]; intk; for(i=0;i<3;i++)//求协方差 for(j=0;j<3;j++) {c[i][j]=0; for(k=0;k<60;k++) c[i][j]+=((Train[i][k]-m[i])*(train[k][j]-m[j])); c[i][j]=c[i][j]/60; } *a=c[0][0]*c[1][1]*c[2][2]+c[0][1]*c[1][2]*c[2][0]+c[0][2]*c[1][0]*c[2][1] -c[0][2]*c[1][1]*c[2][0]-c[0][0]*c[1][2]*c[2][1]-c[0][1]*c[1][0]*c[2][2]; *a=(-0.5)*log(*a)+log(p)-25*log(2*PI); gauss(3,c); } floatidentify(floatm[3],floatc[3][3],floata,floatband1,floatband2,floatband3) {//计算待分样本的d(X) floatx[3]; x[0]=band1;x[1]=band2;x[2]=band3; inti,j; for(i=0;i<3;i++) x[i]-=m[i]; floatd[3]; for(i=0;i<3;i++) {d[i]=0; for(j=0;j<3;j++) d[i]+=(x[i]*c[j][i]); } doubleq=0; for(i=0;i<3;i++) q+=x[i]*d[i]; q=(-0.5)*q+a; q=exp(q); returnq; } intclassify(floatp1,floatp2,floatp3,floatp4)//根据后验概率将像元归为指定类别 { floatp[4]; p[0]=p1;p[1]=p2;p[2]=p3;p[3]=p4; inti,k=0; floatmax=p[0]; for(i=1;i<4;i++) if(max {max=p[i]; k=i; } k++; returnk; } voidtesting() { doublep1,p2,p3,p4,p5,p6,p7; floatkappa(intk[4][4]); inti,j; for(i=0;i<240;i++) { p1=identify(m1,c1,a1,test[i][3],test[i][4],test[i][5]); p2=identify(m2,c2,a2,test[i][3],test[i][4],test[i][5]); p3=identify(m3,c3,a3,test[i][3],test[i][4],test[i][5]); p4=identify(m4,c4,a4,test[i][3],test[i][4],test[i][5]); p5=identify(m5,c5,a5,test[i][3],test[i][4],test[i][5]); p6=identify(m6,c6,a6,test[i][3],test[i][4],test[i][5]); p7=identify(m7,c7,a7,test[i][3],test[i][4],test[i][5]); doubledx=p1+p2+p3+p4+p5+p6+p7; p1=p1/dx;p2=p2/dx; p3=p3/dx;p4=p4/dx; p5=p5/dx;p6=p6/dx; p7=p7/dx; test[i][7]=p1; test[i][8]=p2; test[i][9]=p3; test[i][10]=p4; test[i][11]=p5; test[i][12]=p6; test[i][113]=p7; test[i][6]=classify(p1,p2,p3,p4,p5,p6,p7); //cout< : fixed)< } for(i=0;i<7;i++) for(j=0;j<7;j++) q[i][j]=0; for(i=0;i<60;i++)//混淆矩阵中的各类别组合数量 { if(test[i][2]==1&&test[i][6]==1)q[0][0]++; if(test[i][2]==1&&test[i][6]==2)q[0][1]++; if(test[i][2]==1&&test[i][6]==3)q[0][2]++; if(test[i][2]==1&&test[i][6]==4)q[0][3]++; if(test[i][2]==1&&test[i][6]==4)q[0][4]++; if(test[i][2]==1&&test[i][6]==4)q[0][5]++; if(test[i][2]==1&&test[i][6]==4)q[0][6]++; } for(i=60;i<120;i++) { if(test[i][2]==2&&test[i][6]==1)q[1][0]++; if(test[i][2]==2&&test[i][6]==2)q[1][1]++; if(test[i][2]==2&&test[i][6]==3)q[1][2]++; if(test[i][2]==2&&test[i][6]==4)q[1][3]++; if(test[i][2]==2&&test[i][6]==4)q[1][4]++; if(test[i][2]==2&&test[i][6]==4)q[1][5]++; if(test[i][2]==2&&test[i][6]==4)q[1][6]++; } for(i=120;i<180;i++) { if(test[i][2]==3&&test[i][6]==1)q[2][0]++; if(test[i][2]==3&&test[i][6]==2)q[2][1]++; if(test[i][2]==3&&test[i][6]==3)q[2][2]++; if(test[i][2]==3&&test[i][6]==4)q[2][3]++; if(test[i][2]==3&&test[i][6]==4)q[2][4]++; if(test[i][2]==3&&test[i][6]==4)q[2][5]++; if(test[i][2]==3&&test[i][6]==4)q[2][6]++; } for(i=180;i<240;i++) { if(test[i][2]==4&&test[i][6]==1)q[3][0]++; if(test[i][2]==4&&test[i][6]==2)q[3][1]++; if(test[i][2]==4&&test[i][6]==3)q[3][2]++; if(test[i][2]==4&&test[i][6]==4)q[3][3]++; if(test[i][2]==3&&test[i][6]==4)q[3][4]++; if(test[i][2]==3&&test[i][6]==4)q[3][5]++; if(test[i][2]==3&&test[i][6]==4)q[3][6]++; } qq1=(float)q[0][0]/60.0; qq2=(float)q[1][1]/60.0; qq3=(float)q[2][2]/60.0; qq4=(float)q[3][3]/60.0; qq5=(float)q[4][3]/60.0; qq6=(float)q[5][3]/60.0; qq7=(float)q[6][3]/60.0; qq=(qq1+qq2+qq3+qq4+qq5+qq6+qq7)/4; qq=qq*100; k=kappa(q); // cout<<"1代表'房顶',2代表'街道',3代表'小路',4代表'草地',5代表'树木',6代表'水体',7代表'阴影'"< // cout<<"正确分类百分比分别为: "; //cout< //cout<<"总分类精度: "< (2)< // cout<<"Kappa值为: "< (2)< } voidoutput(char*filename) {ofstreamoutfile(filename,ios: : out); if(outfile==0) {cout<<"openoutfileerror! "< exit (1); } outfile<<"1代表'房顶',2代表'街道',3代表'小路',4代表'草地',5代表'树木',6代表'水体',7代表'阴影'"< outfile<<"正确分类百分比分别为: "; outfile< outfile<<"总分类精度: "< outfile<<"row"<<"col"<<"before"<<"after"<<"proba1"<<"proba2"<<"proba3"<<"proba4"< inti; for(i=0;i<240;i++) { outfile< : fixed)< outfile< : fixed)< } outfile.close(); } voidgauss(intf,floatn[3][3]) { inti,j,k; floatp,q,h[3]; for(k=f-1;k>=0;k--) {p=n[0][0]; for(i=1;i {q=n[i][0]; h[i]=((i>k)? q: -q)/p; for(j=1;j<=i;j++) n[i-1][j-1]=n[i][j]+q*h[j]; } n[f-1][f-1]=1/p; for(i=1;i n[f-1][i-1]=h[i]; } for(i=1;i for(j=0;j n[j][i]=n[i][j]; } floatkappa(intk[4][4]) { inti,j; floatK; intc[4],d[4]; intN=0,M=0,D=0; for(i=0;i<4;i++) { c[i]=0; d[i]=0; } for(i=0;i<4;i++) for(j=0;j<4;j++) { N+=k[i][j]; if(i==j)D=D+k[i][j]; c[i]=k[i][j]+c[i]; d[j]=k[i][j]+d[j]; } for(i=0;i<4;i++) M=c[i]*d[i]+M; K=floa
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 遥感 影像 监督 分类 相关 代码 实现