模式识别第三次作业-KL变换_第1页
模式识别第三次作业-KL变换_第2页
模式识别第三次作业-KL变换_第3页
模式识别第三次作业-KL变换_第4页
模式识别第三次作业-KL变换_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、模式识别作业三一、编程要求:编程实现KL变换,并对TM六波段图像进行演算。KL变换的思想是:从n维特征选取m维特征,删去的n-m维特征不一定就是无用的信息,如何在信息损失最小的情况下选取特征,在理论上就显得更严密些。通常采用正交变换,得到新的经变换的模式, 以保证信息损失最小情况下获得有利于分类的特征。二、编程思想:将6副图象依次输入获得灰度值存在一个6*size(size为一副图象的像素数)的二维数组中,计算每个波段的灰度均值,然后计算协方差矩阵,得出特征值和特征向量,再重新计算要输出的处理的图象的灰度。三、核心代码:void CKLchangeView:Oninput() /TM图象数据读

2、入AfxMessageBox("注意:请一次将6副图象都读入!");/读图象的方法int flag=0;while(flag<6)CFileDialog dlg(TRUE,"bmp",".bmp");if(dlg.DoModal()=IDOK)m_NewFileNameflag=dlg.GetFileName();for(int j=0;j<5;j+)if(flag=j|m_NewFileNameflag!=m_NewFileNamej) continue;else AfxMessageBox("已打开过的图象!

3、请按方法重新打开!");flag=0; for(int i=0;i<6;i+) m_NewFileNamei=""return;NewFileName=m_NewFileNameflag;flag+;/判断是否是已经打开的图象,若已经打开,则要重新按方法打开else /不读图象,或是只是要看图象for(int i=0;i<6;i+) m_NewFileNamei=""return;CDC *pDC = GetWindowDC();CFile f(NewFileName,0);m_pDib.Read(&f);/读图象if(m_

4、pDib.m_nColorTableEntries!=256)/判断是否是灰度图象AfxMessageBox("请打开灰度图象!");return;CKLchangeDoc* pDoc = GetDocument(); pDoc->pDib=&m_pDib;OnDraw(pDC);/调用OnDraw函数绘图sizeImage = m_pDib.GetDimensions(); sizeSaveImage = m_pDib.GetDibSaveDim(); a=sizeSaveImage.cx * sizeSaveImage.cy;/象素数if(flag=1)

5、tm=CMatrix(6,a);/开第一副图象时为矩阵分配内存 /将每幅图象象素灰度值放入矩阵中if(flag=1)for(int i=0;i<a;i+)tm.m_pDatai=*(m_pDib.m_lpImage+sizeSaveImage.cx*(i/sizeImage.cx)+i%sizeImage.cx);if(flag=2)for(int i=0;i<a;i+)tm.m_pDataa+i=*(m_pDib.m_lpImage+sizeSaveImage.cx*(i/sizeImage.cx)+i%sizeImage.cx);if(flag=3)for(int i=0;i&

6、lt;a;i+)tm.m_pData2*a+i=*(m_pDib.m_lpImage+sizeSaveImage.cx*(i/sizeImage.cx)+i%sizeImage.cx);if(flag=4)for(int i=0;i<a;i+)tm.m_pData3*a+i=*(m_pDib.m_lpImage+sizeSaveImage.cx*(i/sizeImage.cx)+i%sizeImage.cx);if(flag=5)for(int i=0;i<a;i+)tm.m_pData4*a+i=*(m_pDib.m_lpImage+sizeSaveImage.cx*(i/siz

7、eImage.cx)+i%sizeImage.cx);if(flag=6)for(int i=0;i<a;i+)tm.m_pData5*a+i=*(m_pDib.m_lpImage+sizeSaveImage.cx*(i/sizeImage.cx)+i%sizeImage.cx);void CKLchangeView:OnKl() /KL变换计算int i,j;xfea.Init(6,1);xfeat.Init(1,6);temp=CMatrix(6,6);feature=new double6;fea.Init(6,6);double tmave6;/求每幅图象的灰度均值for (i=

8、0;i<6;i+)tmavei=0;for(j=0;j<a;j+)tmavei+=tm.m_pDatai*a+j;tmavei/=(double)a;/求方差矩阵Rfor(j=0;j<36;j+) temp.m_pDataj=0.0;for(i=0;i<a;i+) temp.m_pDataj+=(tm.m_pData(j/6)*a+i%6-tmavej/6)*(tm.m_pData(j%6)*a+i%6-tmavej%6);temp.m_pDataj/=(double)a; temp.JacobiEigenv2(feature, fea, 0.000001);/求特征值

9、和特征向量 double t=0.0;double featuretemp6;/临时变量 for(i=0;i<6;i+)featuretempi=featurei;/给临时数组赋值 for(i=0;i<6;i+)/"冒泡法"将特征值排序 for(j=0;j<5;j+) if(featurej>featurej+1) t=featurej; featurej=featurej+1; featurej+1=t; for(i=0;i<6;i+)/求出特征值排序后对应在特征值数组中的位置 for(j=0;j<6;j+) if(featurei=f

10、eaturetempj) indexi=j; void CKLchangeView:OnFirst() /第一主分量 if(NewFileName="") AfxMessageBox("请先读入图象数据!");return;if(fea.m_pData0=0) OnKl();result.Init(1,a);for(int i=0;i<a;i+)for(int j=0;j<6;j+) result.m_pDatai+=fea.m_pDataindex5+j*6*tm.m_pDataj*a+i; Draw();void CKLchangeVie

11、w:OnFive() /第五主分量if(NewFileName="") AfxMessageBox("请先读入图象数据!");return;if(fea.m_pData0=0) OnKl();result.Init(1,a);for(int i=0;i<a;i+)for(int j=0;j<6;j+) result.m_pDatai+=fea.m_pDataindex1+j*6*tm.m_pDataj*a+i; Draw();void CKLchangeView:OnFour() /第四主分量if(NewFileName="&quo

12、t;) AfxMessageBox("请先读入图象数据!");return;if(fea.m_pData0=0) OnKl();result.Init(1,a);for(int i=0;i<a;i+)for(int j=0;j<6;j+) result.m_pDatai+=fea.m_pDataindex2+j*6*tm.m_pDataj*a+i; Draw();void CKLchangeView:OnSecond() /第二主分量if(NewFileName="") AfxMessageBox("请先读入图象数据!")

13、;return;if(fea.m_pData0=0) OnKl();result.Init(1,a);for(int i=0;i<a;i+)for(int j=0;j<6;j+) result.m_pDatai+=fea.m_pDataindex4+j*6*tm.m_pDataj*a+i;Draw();void CKLchangeView:OnSix() /第六主分量if(NewFileName="") AfxMessageBox("请先读入图象数据!");return;if(fea.m_pData0=0) OnKl();result.Ini

14、t(1,a);for(int i=0;i<a;i+)for(int j=0;j<6;j+) result.m_pDatai+=fea.m_pDataindex0+j*6*tm.m_pDataj*a+i; Draw();void CKLchangeView:OnThird() /第三主分量if(NewFileName="") AfxMessageBox("请先读入图象数据!");return;if(fea.m_pData0=0) OnKl(); result.Init(1,a);for(int i=0;i<a;i+)for(int j=0;j<6;j+) result.m_pDatai+=fea.m_pDataindex3+j*6*tm.m_pDataj*a+i; Draw();void CKLchangeView:Draw() /图象输出int i;for(i=0;i<a;i+)/处理越界的灰度值if(result.m_pDatai<0) result.m_pDatai=0; if(result.m_pDatai>255) result.m_pDatai=255; for (i = 0; i <a; i +)/重新给图象每个象素赋灰度值 un

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论