✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。
🍎个人主页:Matlab科研工作室
🍊个人信条:格物致知。
更多Matlab仿真内容点击👇
⛄ 内容介绍
一实验目的:
利用matlab软件,通过K-means算法的方法处理给定的7幅遥感图像,将其分成水域、居民区和其他三类区域。
二实验方法:
1 遥感图像的分类[1]
遥感图像是通过反映地物光谱信息的像元亮度值及反映地物空间信息的像元空间变化来表征不同地物的。对遥感图像中各类地物的光谱信息和空间信息进行分析,选择特征(能够反映地物光谱信息和空间信息并可用于遥感图像分类处理的变量),并用一定的方式将特征空间划分为互不重叠的子空间,然后将图像中各个像元划归到各个子空间去。这就是图像分类。其理论依据是:遥感图像中的同类地物在相同的条件下,应具有相同或相似的光谱和空间信息特征,从而表现出同类地物的某种内在的相似性,将集群在同一特征空间区域;而不同类的地物其光谱和空间信息特征不同,将集群在不同的特征空间区域。
在遥感图像的分类中,按照是否有已知训练样本的分类数据,分类方法可分为:监督和非监督两大类。我们所进行的卫星核查方面的研究,缺少一定的训练样本,所以一般只能采用非监督分类的方法。非监督分类方法快速简单具有一定的精度,可作为监督分类的重要补充手段。常用的处理方法有:平行六面体分类、简单均方差阈值分类、动态聚类分类,每种分类方法各有优缺点。对于遥感图像使用动态聚类方法比较理想。
2 动态聚类
动态聚类分析可通过分析像元的类似度(距离)一次完成像元的归并分类,也可以多次完成。我们的作法是先按某些原则选择一些代表点作为聚类的核心,然后把其余的待分点按某种方法(判据准则)分到各类中去,完成初始分类。初始分类完成以后,重新计算各聚类中心,把各点按初始判据重新分到各类,完成了第一次迭代。然后再修改聚类中心,再进行下一次迭代,用来对上次分类结果进行修改。如此反复进行,直到最后满意为止。动态聚类算法是一种普遍采用的方法,具有以下三个要点:
(1) 选定某种距离度量作为样本间的相似性度量。
(2) 确定某个评价聚类结果质量的准则函数。
(3) 给定某个初始分类,然后用迭代算法找出使准则函数取极值的最好聚类结果。
动态聚类方法有很多,并且还在不断地发展,各种分类方法各有优缺点,其中K-means和ISO-DATA算法是目前较为成熟的两种动态聚类方法。通过从模型上进行的分析比较发现:K-means及ISODATA算法的优点在于把分析判别的统计聚类算法和简单多光谱分类融合在一起,使聚类更准确、客观。
3 K-means算法(本实验所用的方法)
K-means算法是一种较典型的逐点修改迭代的动态聚类算法,也是一种普遍采用的方法,其要点是以误差平方和为准则函数。一般的作法是先按某些原则选择一些代表点作为聚类的核心,然后把其余的待分点按某种方法(判据准则)分到各类中去,完成初始分类。初始分类完成以后,重新计算各聚类中心,完成了第一次迭代。然后修改聚类中心,以便进行下一次迭代。这种修改有两种方案,即逐点修改和逐批修改。逐点修改类中心就是一个像元样本按某一原则归属于某一组类后,就要重新计算这个组类的均值,并且以新的均值作为凝聚中心点进行下一次像元聚类。逐批修改类中心就是在全部像元样本按某一组的类中心分类之后,再计算修改各类的均值,作为下一次分类的凝聚中心点。采用了以下K-means算法:
⛄ 部分代码
clear all; s=imread('L1.bmp'); s=double(s); X1=20;X2=45;X3=90; num1=0;num2=0;num3=0;[M,N]=size(s); R=zeros(M,N); a=10;b=20;counter=0; format long; while(abs(b-a)>0.001) counter=counter+1 a b=a; a=0; for i=1:M for j=1:N %------------------------------------------------------- p1=(s(i,j)-X1).^2; p2=(s(i,j)-X2).^2; p3=(s(i,j)-X3).^2; min_p=min([p1,p2,p3]); if (p1==min_p) R(i,j)=1; num1=num1+1; elseif (p2==min_p) R(i,j)=2; num2=num2+1; elseif (p3==min_p) R(i,j)=3; num3=num3+1; end a=a+sqrt(min_p); end end X1=X1*0; X2=X2*0; X3=X3*0; a=a/M/N; %--------------------------------------------------- for i=1:M for j=1:N if (R(i,j)==1) X1=X1+s(i,j); elseif (R(i,j)==2) X2=X2+s(i,j); elseif (R(i,j)==3) X3=X3+s(i,j); end end end X1=X1/num1; num1=0; X2=X2/num2; num2=0; X3=X3/num3; num3=0; end r=zeros(M,N); for i=1:M for j=1:N if (R(i,j)==1) r(i,j)=30; elseif(R(i,j)==2) r(i,j)=100; elseif(R(i,j)==3) r(i,j)=200; end end end r=uint8(r); figure; imshow(r); imwrite(r,'r1.bmp');
⛄ 运行结果
通过K-means算法,并用matlab程序来实现,将给定了7幅遥感图像通过处理,分成水域、居民区和其他三类区域。并用RGB彩色进行标记划分,这样看起来更易识别。
上述的K-means算法是在类别数k给定的情况下进行的。当类别数未知的情况下,在使用k-均值算法时,可以假设类别数是逐步增加的。例如,对k=1,k=2,k=3,… ,分别使用该算法。显然,准则函数是随k的增加而单调地减少的。当数据集表现为k′个很集中的聚类时, 随着从一个聚类增加到k′个聚类而迅速减少。当k再增加时,相当于将本来是较密集的类再行分开。因此Je虽有所减少,但减少的速度比较缓慢,直到k=N时, 等于0。如果作一条~k的曲线,其拐点对应的就是最优的聚类数。
K-means分类方法简便易行,实践表明该方法对卫星数据分类处理效果很好,在地球物理和地质探查分析中获得了成功应用。
⛄ 参考文献
[1] 陈华,陈书海,张平,严卫东. K-means算法在遥感分类中的应用. [J].红外与激光工程,2000,29.