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

📄 kltransdlg.cpp

📁 模式识别变换程序源码处理影响的六个波段格式
💻 CPP
📖 第 1 页 / 共 4 页
字号:
           fprintf(fpt,"%14.6f",mvarTM[i][j]);
		}
		fprintf(fpt,"%s\n\n"," ");
	}
	fprintf(fpt,"%s\n","-------------------------------协方差矩阵-------------------------------");
	fprintf(fpt,"%s\n","-------------------------------特征向量矩阵-------------------------------");
    for(i=0;i<6;i++)
	{
		for(j=0;j<6;j++)
		{
           fprintf(fpt,"%14.6f",a[i][j]);
		}
		fprintf(fpt,"%s\n\n"," ");
	}
	fprintf(fpt,"%s\n","-------------------------------特征向量矩阵-------------------------------");
	fclose(fpt);
	CDialog::OnOK();
    MessageBox("所选分量的图象和统计的文本文件已按照您指定的路径和文件名写入磁盘,请查看!","提示",
		MB_ICONINFORMATION|MB_OK);
}

double CKLTransDlg::getAver(int h, int w, LPSTR lpbits, LONG line)
{
	int i,j;
	double sum=0;
	unsigned char * lpsr;
	double GrayTable[256];
	for(i=0;i<256;i++)
	{
        GrayTable[i]=0;
	}
	for(i=0;i<h;i++)
	{
		for(j=0;j<w;j++)
		{
			lpsr=(unsigned char*)(lpbits+line*i+3*j);
            GrayTable[*lpsr]++;
		}
	}
    for(i=0;i<256;i++)
	{
       sum+=GrayTable[i]*i;
	}
	sum=sum/(double)(h*w);
	return sum;
}

double CKLTransDlg::getVar(double aver, int h, int w, LPSTR lpbits, LONG line)
{
    int i,j;
	double sum=0;
	unsigned char * lpsr;
	for(i=0;i<h;i++)
	{
		for(j=0;j<w;j++)
		{
			lpsr=(unsigned char*)(lpbits+line*i+3*j);
            sum+=(*lpsr-aver)*(*lpsr-aver);
		}
	}
	sum=sum/(double)(h*w);
	return sum;
}

double CKLTransDlg::getVari(double aver1,double aver2, LPSTR lpbits1, LPSTR lpbits2,
							LONG line, int h, int w)
{
    int i,j;
	double sum=0;
	unsigned char * lpsr1;
	unsigned char * lpsr2;
	for(i=0;i<h;i++)
	{
		for(j=0;j<w;j++)
		{
			lpsr1=(unsigned char*)(lpbits1+line*i+3*j);
			lpsr2=(unsigned char*)(lpbits2+line*i+3*j);
            sum+=(*lpsr1-aver1)*(*lpsr2-aver2);
		}
	}
	sum=sum/(double)(h*w);
	return sum;
}

void CKLTransDlg::cstrq(double *a, int n, double *q, double *b, double *c)
{
    int i,j,k,u;
    double h,f,g,h2;
    for (i=0; i<=n-1; i++)
    for (j=0; j<=n-1; j++)
      { u=i*n+j; q[u]=a[u];}
    for (i=n-1; i>=1; i--)
      { h=0.0;
        if (i>1)
          for (k=0; k<=i-1; k++)
            { u=i*n+k; h=h+q[u]*q[u];}
        if (h+1.0==1.0)
          { c[i]=0.0;
            if (i==1) c[i]=q[i*n+i-1];
            b[i]=0.0;
          }
        else
          { c[i]=sqrt(h);
            u=i*n+i-1;
            if (q[u]>0.0) c[i]=-c[i];
            h=h-q[u]*c[i];
            q[u]=q[u]-c[i];
            f=0.0;
            for (j=0; j<=i-1; j++)
              { q[j*n+i]=q[i*n+j]/h;
                g=0.0;
                for (k=0; k<=j; k++)
                  g=g+q[j*n+k]*q[i*n+k];
                if (j+1<=i-1)
                  for (k=j+1; k<=i-1; k++)
                    g=g+q[k*n+j]*q[i*n+k];
                c[j]=g/h;
                f=f+g*q[j*n+i];
              }
            h2=f/(h+h);
            for (j=0; j<=i-1; j++)
              { f=q[i*n+j];
                g=c[j]-h2*f;
                c[j]=g;
                for (k=0; k<=j; k++)
                  { u=j*n+k;
                    q[u]=q[u]-f*c[k]-g*q[i*n+k];
                  }
              }
            b[i]=h;
          }
      }
    for (i=0; i<=n-2; i++) c[i]=c[i+1];
    c[n-1]=0.0;
    b[0]=0.0;
    for (i=0; i<=n-1; i++)
      { if ((b[i]!=0.0)&&(i-1>=0))
          for (j=0; j<=i-1; j++)
            { g=0.0;
              for (k=0; k<=i-1; k++)
                g=g+q[i*n+k]*q[k*n+j];
              for (k=0; k<=i-1; k++)
                { u=k*n+j;
                  q[u]=q[u]-g*q[k*n+i];
                }
            }
        u=i*n+i;
        b[i]=q[u]; q[u]=1.0;
        if (i-1>=0)
          for (j=0; j<=i-1; j++)
            { q[i*n+j]=0.0; q[j*n+i]=0.0;}
      }
    return;
}

int CKLTransDlg::csstq(int n, double *b, double *c, double *q, double eps, int l)
{
 int i,j,k,m,it,u,v;
    double d,f,h,g,p,r,e,s;
    c[n-1]=0.0; d=0.0; f=0.0;
    for (j=0; j<=n-1; j++)
      { it=0;
        h=eps*(fabs(b[j])+fabs(c[j]));////////////////////////
        if (h>d) d=h;
        m=j;
        while ((m<=n-1)&&(fabs(c[m])>d)) m=m+1;
        if (m!=j)
          { do
              { if (it==l)//
                  { printf("fail\n");
                    return(-1);
                  }
                it=it+1;
                g=b[j];
                p=(b[j+1]-g)/(2.0*c[j]);
                r=sqrt(p*p+1.0);
                if (p>=0.0) b[j]=c[j]/(p+r);
                else b[j]=c[j]/(p-r);
                h=g-b[j];
                for (i=j+1; i<=n-1; i++)
                  b[i]=b[i]-h;
                f=f+h; p=b[m]; e=1.0; s=0.0;
                for (i=m-1; i>=j; i--)
                  { g=e*c[i]; h=e*p;
                    if (fabs(p)>=fabs(c[i]))
                      { e=c[i]/p; r=sqrt(e*e+1.0);
                        c[i+1]=s*p*r; s=e/r; e=1.0/r;
                      }
                    else
		      { e=p/c[i]; r=sqrt(e*e+1.0);
                        c[i+1]=s*c[i]*r;
                        s=1.0/r; e=e/r;
                      }
                    p=e*b[i]-s*g;
                    b[i+1]=h+s*(e*g+s*b[i]);
                    for (k=0; k<=n-1; k++)
                      { u=k*n+i+1; v=u-1;
                        h=q[u]; q[u]=s*q[v]+e*h;
                        q[v]=e*q[v]-s*h;
                      }
                  }
                c[j]=s*p; b[j]=e*p;
              }
            while (fabs(c[j])>d);
          }
        b[j]=b[j]+f;
      }
    for (i=0; i<=n-1; i++)
      { k=i; p=b[i];
        if (i+1<=n-1)
          { j=i+1;
            while ((j<=n-1)&&(b[j]<=p))
              { k=j; p=b[j]; j=j+1;}
          }
        if (k!=i)
          { b[k]=b[i]; b[i]=p;
            for (j=0; j<=n-1; j++)
              { u=j*n+i; v=j*n+k;
                p=q[u]; q[u]=q[v]; q[v]=p;
              }
          }
      }
    return(1);
}

void CKLTransDlg::OnCheck7() 
{
	// TODO: Add your control notification handler code here
	UpdateData(true);
	if(m_n[6]==0)
	{
		m_n[6]=1;
		GetDlgItem(IDC_FENLIANG7)->EnableWindow(true);
		GetDlgItem(IDC_BROWSE17)->EnableWindow(true);
		GetDlgItem(IDC_CHECKALL)->EnableWindow(false);
	}
	else if(m_n[6]==1)
	{
        m_n[6]=0;
		GetDlgItem(IDC_FENLIANG7)->EnableWindow(false);
		GetDlgItem(IDC_BROWSE17)->EnableWindow(false);
	}	
}

void CKLTransDlg::OnBrowse17() 
{
	// TODO: Add your control notification handler code here
	static char BASED_CODE file[]="BMP Files(*.BMP)|*.bmp|所有文件(*.*)||";
	CFileDialog Select(FALSE,"bmp",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,file,NULL);
	Select.DoModal();
	CString FileName;
    FileName=Select.GetPathName();
	m_strFenliang7=FileName;
	UpdateData(false);	
}

double CKLTransDlg::getShang(int h, int w, LPSTR lpbits, LONG line)
{
    double pArray[256];
    int i,j;
	double sum;
	sum=0;
	unsigned char * lpsr;
	for(i=0;i<256;i++)
	{
		pArray[i]=0;
	}
	for(i=0;i<h;i++)
	{
		for(j=0;j<w;j++)
		{
			lpsr=(unsigned char*)(lpbits+line*i+3*j);
            pArray[*lpsr]++;
		}
	}
 
    for(i=0;i<256;i++)
	{
        pArray[i]/=(h*w);
	}

	for(i=0;i<256;i++)
	{
		sum+=(-pArray[i]*log(pArray[i])/log(2));
	}

	return sum;
}

int CKLTransDlg::eejcb(double a[], int n, double v[], double eps, int jt)
{
	int i,j,p,q,u,w,t,s,l;
		double fm,cn,sn,omega,x,y,d;
		l=1;
		for (i=0; i<=n-1; i++)
	{ 
	  v[i*n+i]=1.0;
			for (j=0; j<=n-1; j++)
	  {
	   if (i!=j) 
	   {
		v[i*n+j]=0.0;
	   }
	  }
	}
		while (1==1)
	{ 
	  fm=0.0;
			for (i=0; i<=n-1; i++)
	  {
	   for (j=0; j<=n-1; j++)
	   { 
		d=fabs(a[i*n+j]);
		if ((i!=j)&&(d>fm))
		{ 
		 fm=d; 
		 p=i; 
		 q=j;
		}
	   }
	  }
			if (fm<eps)  
	  {
	   return(1);
	  }
			if (l>jt)  
	  {
	   return(-1);
	  }
			l=l+1;
			u=p*n+q; 
	  w=p*n+p; 
	  t=q*n+p; 
	  s=q*n+q;
			x=-a[u];
	  y=(a[s]-a[w])/2.0;
			omega=x/sqrt(x*x+y*y);
			if (y<0.0)
	  {
	   omega=-omega;
	  }
			sn=1.0+sqrt(1.0-omega*omega);
			sn=omega/sqrt(2.0*sn);
			cn=sqrt(1.0-sn*sn);
			fm=a[w];
			a[w]=fm*cn*cn+a[s]*sn*sn+a[u]*omega;
			a[s]=fm*sn*sn+a[s]*cn*cn-a[u]*omega;
			a[u]=0.0;
	  a[t]=0.0;
			for (j=0; j<=n-1; j++)
	  {
	   if ((j!=p)&&(j!=q))
	   { 
		u=p*n+j;
		w=q*n+j;
		fm=a[u];
		a[u]=fm*cn+a[w]*sn;
		a[w]=-fm*sn+a[w]*cn;
	   }
	  }
			for (i=0; i<=n-1; i++)
	  {
	   if ((i!=p)&&(i!=q))
				{ 
		u=i*n+p; 
		w=i*n+q;
		fm=a[u];
		a[u]=fm*cn+a[w]*sn;
		a[w]=-fm*sn+a[w]*cn;
				}
	  }
			for (i=0; i<=n-1; i++)
	  { 
	   u=i*n+p; 
	   w=i*n+q;
				fm=v[u];
				v[u]=fm*cn+v[w]*sn;
				v[w]=-fm*sn+v[w]*cn;
	  }
	}
	return(1);

}

void CKLTransDlg::OnExitdlg() 
{
	// TODO: Add your control notification handler code here
	CDialog::OnCancel();
}

void CKLTransDlg::OnTips() 
{
	// TODO: Add your control notification handler code here
	MessageBox("请依次选择待输入的同一TM图象的6个波段图象文件,然后设定输出路径和文件名,然后点 确定 进行处理!");
}

⌨️ 快捷键说明

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