作者:朱金灿<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
来源:blog.csdn.net/clever101
主成份分析(Principal Component Analysis,PCA)也叫做主成份变换、主分量分析或 —L(Karhunen—Loeve)变换,是建立在统计特征基础上的多维(如多波段)正交线
性变换。它是遥感图像处理中最常用也是最有用的变换算法之一。
这次我要实现一个主成分分析算法,图是做出来了,但是和著名的遥感软件PCI和ENVI的效果比起来很差。如第一主成分的图如下:
上面噪音极多,而且看起来不合谐。我知道自己的算法有问题,在排除了自己的读取图像的问题后。我考虑到是不是求取特征矩阵时出了问题,因为主成分的输出数据是Y=X*A。
其中X为原图像,Y为目标图像,A为特征向量矩阵。由此我怀疑我的特征矩阵求取有问题。后来从网上找了一种求特征矩阵的办法,进行主成分分析的效果。下面是具体的实现代码:
-
-
-
-
staticintiJcobiMatrixCharacterValue(double**pdblCof,longlChannelCount,std::vector<double>&pdblVects,doubledblEps,longljt)
- {
-
longi,j,p,q,u,w,t,s,l;
-
doublefm,cn,sn,omega,x,y,d;
- l=1;
-
for(i=0;i<lChannelCount;i++)
- {
- pdblVects[i*lChannelCount+i]=1.0;
-
for(j=0;j<lChannelCount;j++)
-
if(i!=j)pdblVects[i*lChannelCount+j]=0.0;
- }
-
while(1){
- fm=0.0;
-
for(i=0;i<lChannelCount;i++)
-
for(j=0;j<lChannelCount;j++)
- {
- d=fabs(pdblCof[i][j]);
-
if((i!=j)&&(d>fm))
- {fm=d;p=i;q=j;}
- }
-
if(fm<dblEps)return1;
-
if(l>ljt)return0;
- l+=1;
- u=p*lChannelCount+q;w=p*lChannelCount+p;t=q*lChannelCount+p;s=q*lChannelCount+q;
- x=-pdblCof[p][q];
- y=(pdblCof[q][q]-pdblCof[p][p])/2.0;
- omega=x/sqrt(x*x+y*y);
-
if(y<0)omega=-omega;
- sn=1.0+sqrt(1.0-omega*omega);
- sn=omega/sqrt(2.0*sn);
- cn=sqrt(1.0-sn*sn);
- fm=pdblCof[p][p];
- pdblCof[p][p]=fm*cn*cn+pdblCof[q][q]*sn*sn+pdblCof[p][q]*omega;
- pdblCof[q][q]=fm*sn*sn+pdblCof[q][q]*cn*cn-pdblCof[p][q]*omega;
- pdblCof[p][q]=0.0;
- pdblCof[q][p]=0.0;
-
for(j=0;j<lChannelCount;j++)
-
if((j!=p)&&(j!=q))
- {
- fm=pdblCof[p][j];
- pdblCof[p][j]=fm*cn+pdblCof[q][j]*sn;
- pdblCof[q][j]=-fm*sn+pdblCof[q][j]*cn;
- }
-
for(i=0;i<lChannelCount;i++)
-
if((i!=p)&&(i!=q)){
- fm=pdblCof[i][p];
- pdblCof[i][p]=fm*cn+pdblCof[i][q]*sn;
- pdblCof[i][q]=-fm*sn+pdblCof[i][q]*cn;
- }
-
for(i=0;i<lChannelCount;i++)
- {
- fm=pdblVects[i*lChannelCount+p];
- pdblVects[i*lChannelCount+p]=fm*cn+pdblVects[i*lChannelCount+q]*sn;
- pdblVects[i*lChannelCount+q]=-fm*sn+pdblVects[i*lChannelCount+q]*cn;
- }
- }
-
return1;
- }
-
-
-
-
staticvoidSortEigenvector(double**pfMatrix,intnBandNum,std::vector<double>&pfVector)
- {
-
longp;
-
doublef;
-
doubleT;
-
intcount=nBandNum;
-
for(inti=0;i<count;i++)
- {
- T=pfMatrix[i][i];
- p=i;
-
for(intj=i;j<count;j++)
-
if(T<pfMatrix[j][j])
- {
- T=pfMatrix[j][j];
- p=j;
- }
-
if(p!=i)
- {
- f=pfMatrix[p][p];
- pfMatrix[p][p]=pfMatrix[i][i];
- pfMatrix[i][i]=f;
-
for(intj=0;j<count;j++)
- {
- f=pfVector[j*count+p];
- pfVector[j*count+p]=pfVector[j*count+i];
- pfVector[j*count+i]=f;
- }
- }
- }
- }
执行上面两步之后,所得到的特征矩阵为用于和原图像相乘的矩阵A.
对一幅TM图像的第1,2,3,4,5,7通道执行PCA操作,效果图如下:
第一主成分:
第二主成分:
第三主成分:
第四主成分:
第五主成分:
第六主成分:
从上面可以看出,正确的图像看起来视觉非常和谐,毫无刺目的感觉。
分享到:
相关推荐
基于SPSS实现的主成分分析实例 内含主成分分析实际例子 共19页PPT 以城镇居民消费支出资料为例,用主成分分析法对各省、市作综合评价(spssex-2/城镇居民消费支出的主成分分析 ) 以经济效益数据为例,用主成分分析...
python经典主成分分析算法,来源于sklearn包函数,具有一定学习价值
主成分分析算法的MATLAB代码实现,可以帮助理解主成分分析算法的计算过程,比直接调用MATLAB函数更利于学习。
对于一个由多个变量描述的复杂事物,人们难以认识,那么是否可以抓住事物主要方面进行重点分析呢?如果事物的主要方面刚好体现在几个主要变量上,我们只需要将这几个变量分离出来,进行详细分析。但是,在一般情况下...
使用EXCEL进行主成分分析的例子,只有先加载分析工具箱
主成分分析和主成分回归的MATLAB实现,含程序,详细
主成分分析(Principal Component Analysis,PCA), 是一种统计方法。通过正交变换将一组可能存在相关性的变量转换为一组线性不相关的变量,转换后的这组变量叫主成分。 在实际课题中,为了全面分析问题,往往提出...
主成分分析
R语言主成分分析方法讲解,以及R语言主成分分析程序和实例
根据PCA基本原理自己写的PCA算法实现代码,没有使用封装函数,主成分分析函数代码,基于最原始的主成分分析理论,可与吴恩达机器学习课程配套使用
使用PCA,对单图像提取主成分分析,达到图像降维的目的,可以学习如何使用OpenCV实现PCA技术。
用java实现的主成分分析算法,用了Jama.Matrix,用的是Jama-1.0.2.jar。代码有备注,希望有帮助。
PCA主成分分析实现方法Matlab;详细请查看博客资料:http://blog.csdn.net/guyuealian/article/details/68487833
主成分分析是种比较实用的数字图像处理技术,应用于特征提取、数据压缩、提高信噪比。本资源提供了主成分分析的c代码与原理文档,希望能对需要的人有所帮助。
R语言主成分分析练习
主成分分析代码程序(自编),编程程序语言为matla,大家可借鉴使用。
PCA主成分分析MATLAB实现代码
PCA是主成分分析,用于数据降维。
主成分分析直接在裁剪后的新郑市区域进行操作。 导入新郑市区域的影像subsect_xinzheng.dat,在工具箱中选择Transform——PCA Rotation——Forward PCA Rotation New Statics and Rotate工具。在弹出的对话框中选择...