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

📄 comput.cpp

📁 基于小波的SAR斑点处理
💻 CPP
📖 第 1 页 / 共 2 页
字号:
void Qsm32(double *ResX,
			  double *ResY,
			  double *Src,
			  int VarNumber,
			  double *ResB)
{
 int t,time1,time2;
 int a_i,b_i;
 int i,j,k,l;
 double *a,*b,*r;
 double *r2;
 //float temp;
 //float s1,s2,s3;
 //float sum_z;
 t = 2;

 time1=add(t+1);
 time2=add(2*t+1);
 a = new double[time2];
 b = new double[time1];
 r =  new double[time1*time1];
 r2 = new double[time1*time1];
 a_i=0;
 for(i=0;i<=2*t;i++)
  {
	for(j=0;j<=i;j++)
	 {
	 *(a+a_i)=0;
	 for(k=0;k<VarNumber;k++)
	  *(a+a_i)+=new_pow(*(ResX+k),*(ResY+k),j,i-j);
	 a_i++;
	 }
  }

 b_i=0;
 for(i=0;i<=t;i++) /*Z*/
  {
	for(j=0;j<=i;j++)
	 {
	 *(b+b_i)=0;
	 for(k=0;k<VarNumber;k++)
	  *(b+b_i)+=new_pow(*(ResX+k),*(ResY+k),j,i-j)*(*(Src+k));
	 b_i++;
	 }
  }
 a_i=0;
 for(i=0;i<=t;i++)
  for(j=0;j<=i;j++)
	{
	 b_i=0;
	 for(k=i;k<=i+t;k++)
	  for(l=0;l<=k-i;l++)
	  {
		*(ResB+b_i)=*(a+k*(k+1)/2+j+l);
		b_i++;
		}
	 assign(ResB,r+a_i*time1,1,time1);
	 a_i++;
	 }
  inv(r,r2,time1);
  mul(r2,b,ResB,time1,time1,1);
  delete a;
  delete b;
  delete r;
  delete r2;
}

int TrendSurface2(double *x,
						 double *y,
						 double *z,
						 int VarNum,
						 int Times,
						 double *bb)
{
	int i;
	int j;
	int k;
	int l;

	int Time1 = add(Times+1);
	int Time2 = add(2*Times+1);
	double *a = new double[Time2];
	double *b = new double[Time1];
	double *r = new double[Time1*Time1];
	double *r2 = new double[Time1*Time1];
	int a_i;
	int b_i;

	a_i=0;
	for(i=0;i<=2*Times;i++)
	{
		for(j=0;j<=i;j++)
		{
			*(a+a_i)=0;
			for(k=0;k<VarNum;k++)
			*(a+a_i)+=new_pow(*(x+k),*(y+k),j,i-j);
			a_i++;
		}
	}

	b_i=0;
	for(i=0;i<=Times;i++) /*Z*/
	{
		for(j=0;j<=i;j++)
		{
			*(b+b_i)=0;
			for(k=0;k<VarNum;k++)
			*(b+b_i)+=new_pow(*(x+k),*(y+k),j,i-j)*(*(z+k));
			b_i++;
		}
	}

	a_i=0;
	for(i=0;i<=Times;i++)
		for(j=0;j<=i;j++)
		{
			b_i=0;
			for(k=i;k<=i+Times;k++)
				for(l=0;l<=k-i;l++)
				{
					*(bb+b_i)=*(a+k*(k+1)/2+j+l);
					b_i++;
				}
			assign(bb,r+a_i*Time1,1,Time1);
			a_i++;
		}
	if(inv(r,r2,Time1)==-1)
		return -1;
	mul(r2,b,bb,Time1,Time1,1);
	delete []a;
	delete []b;
	delete []r;
	delete []r2;
	return 0;
}

double GetMean(float * fp,long Size)
{
	double Sum=0;
	for(long order=0;order<Size;order++)
		Sum+=(double)fp[order];
	return (double)(Sum/Size);
}

double GetStdE(float *fp,double Mean,long Size)
{
	double Sum=0;
	for(long order=0;order<Size;order++)
		Sum+=(fp[order]-Mean)*(fp[order]-Mean);
	return (double)sqrt(Sum/(Size-1));
}

double GetMean(BYTE * fp,long Size)
{
	double Sum=0;
	for(long order=0;order<Size;order++)
		Sum+=(double)fp[order];
	return (double)(Sum/Size);
}

double GetStdE(BYTE *fp,double Mean,long Size)
{
	double Sum=0;
	for(long order=0;order<Size;order++)
		Sum+=(fp[order]-Mean)*(fp[order]-Mean);
	return (double)sqrt(Sum/(Size-1));
}

//FFT
// compute x to the power of y
int powerof2(int x, int y)
{
	int z,i;
	z=1;
	i=0;
	while( z<y )
	{
		z=z*x;
		i++;
	}
	return i;
}

// One-dimensional fast Fourier transform
void FFT1D(float xr[],float xi[],int LENGTH,int inve,int POWER)
{
	int n,nv2,nm1,k,i,ii,j,ie,iei,ip;
	float treal,timag,ur,ui,wr,wi,yr,yi,pi=3.141593F;

	n=(int)pow((double)2,(double)POWER);
	nv2=n/2;
	nm1=n-1;
	j=0;
	for (i=0;i<nm1;++i) 
	{
		if (i<=j) 
		{
			treal=xr[j]; timag=xi[j];
			xr[j]=xr[i]; xi[j]=xi[i];
			xr[i]=treal; xi[i]=timag;
		}
		k=nv2;
		while (k<=j) 
		{
			j -= k;
			k /=2;
		}
		j += k;
	}

	for (ii=1;ii<=POWER;ii++) 
	{
		ie=(int)pow((double)2,(double)ii);
		iei=ie/2;
		ur=1.0F; ui=0.0F;
		wr=(float)cos(pi/iei);
		if (inve==1)
			wi=(float)sin(pi/iei);
		else
			wi=-(float)sin(pi/iei);
		for (j=0;j<iei;++j) 
		{
			for (i=j;i<LENGTH;i+=ie)
			{
				ip=i+iei;
				treal=xr[ip]*ur-xi[ip]*ui;
				timag=xi[ip]*ur+xr[ip]*ui;
				xr[ip]=xr[i]-treal;
				xi[ip]=xi[i]-timag;
				xr[i] +=treal;
				xi[i] +=timag;
			}
			yr=ur*wr-ui*wi;
			yi=ui*wr+ur*wi;
			ur=yr;
			ui=yi;
		}
	}
	return;
} // FFT1D
                                                      
// two-dimensional Fourier transform and highpass filtering
void FFT2D( float *lProfilereal,float *lProfileimag,int LENGTH,int inve,int POWER)
{
	float *lpreal;
	float *lpimag;

	float *xreal = new float[LENGTH];
	ASSERT(xreal != NULL);
	float *ximag = new float[LENGTH];		// used for the FFT
	ASSERT(ximag != NULL);
	
	int i,j;
	float fLENGTH;
	DWORD lLENGTH;

	lLENGTH = LENGTH;
	fLENGTH = (float)LENGTH*LENGTH;
	//POWER = powerof2( 2, LENGTH );
	//MAXF = (int)ceil((double)( 1.414F * LENGTH * 0.5F ));
	for (j=0;j<LENGTH;j++)
	{
		for (i=0;i<LENGTH;i++)
		{
			xreal[i]=*( lProfilereal+(DWORD)LENGTH*i+j );
			ximag[i]=*( lProfileimag+(DWORD)LENGTH*i+j );
		}
		FFT1D(xreal, ximag, LENGTH, inve,POWER);
		for (i=0;i<LENGTH;i++)
		{
			*( lProfilereal+(DWORD)LENGTH*i+j )=xreal[i];
			*( lProfileimag+(DWORD)LENGTH*i+j )=ximag[i];
		}
	}

	for (i=0;i<LENGTH;i++)
	{
		lpreal = lProfilereal + i*lLENGTH;
		lpimag = lProfileimag + i*lLENGTH;
		for (j=0;j<LENGTH;j++, lpreal++, lpimag++)
		{
			xreal[j]=*lpreal;
			ximag[j]=*lpimag;
		}
		FFT1D( xreal, ximag, LENGTH, inve,POWER);
		lpreal = lProfilereal + i*lLENGTH;
		lpimag = lProfileimag + i*lLENGTH;
		for (j=0;j<LENGTH;j++, lpreal++, lpimag++)
		{
			*lpreal =xreal[j];
			*lpimag =ximag[j];
		}
	}

	if ( inve == 0 )
	{
		lpreal = lProfilereal;
		lpimag = lProfileimag;
		for (i=0;i<LENGTH;i++)
		{
			for (j=0;j<LENGTH;j++, lpreal++, lpimag++)
			{
				*lpreal /= fLENGTH;
				*lpimag /= fLENGTH;
			}
		}
	}
	delete []xreal;
	delete []ximag;

	return;
} // FFT2D

void DrawRect(CDC * pDC, POINT * pnt1, POINT * pnt2)
{
	int minX,maxX,minY,maxY;
	if(pnt1->x < pnt2->x)
	{
		minX = pnt1->x;
		maxX = pnt2->x;
	}
	else
	{
		minX = pnt2->x;
		maxX = pnt1->x;
	}
	if(pnt1->y < pnt2->y)
	{
		minY = pnt1->y;
		maxY = pnt2->y;
	}
	else
	{
		minY = pnt2->y;
		maxY = pnt1->y;
	}
	pDC->MoveTo(minX,minY);
	pDC->LineTo(minX,maxY);
	
	//pDC->MoveTo(point2.x,point1.y);
	pDC->LineTo(maxX,maxY);

	//pDC->MoveTo(point2);
	pDC->LineTo(maxX,minY);

	//pDC->MoveTo(point1.x,point2.y);
	pDC->LineTo(minX,minY);
}

int intAbs(int nTemp)
{
	if(nTemp > 0)
		return nTemp;
	else
		return -nTemp;
}

float fAbs(float fTemp)
{
	if(fTemp>0)
		return fTemp;
	else
		return -fTemp;
}

double doubleAbs(double dTemp)
{
	if(dTemp >0)
		return dTemp;
	else
		return -dTemp;
}

int SymFold(int x,int xSize)
{
	if(x < 0)
		x = -x;
	if(x >= xSize)
		x = 2*xSize-x-2;

	return x;
}

void Sort(BYTE * data, int size)
{	// 采用简单的冒泡排序
	BYTE temp;
	for(int flag=0; flag<size-1; flag++)
		for(int i=flag; i<size-1; i++)
			if(data[i]>data[i+1])
			{
				temp = data[i];
				data[i] = data[i+1];
				data[i+1] = temp;
			}
}

float Mean(BYTE * a,int m)
{
	double sum = 0;
	for(int i=0; i<m; i++)
		sum = sum + a[i];
	return float(sum/m);
}

float STD(BYTE * a,int m,float fMean)
{
	if(fMean != 65535)
		fMean = Mean(a,m);
	double v = 0;
	for(int i=0; i<m; i++)
		v = v + (a[i]-fMean)*(a[i]-fMean);
	v = sqrt(v/m);

	return float(v);
}

// 融合规则一
// 采用能量作为"显著性因子",对某尺度某方向的小波系数整体作选择估计
// 结果保存在 "pATemp" 中;
void WholeSelect(float * pETemp,float * pATemp,int width,int height)
{
	int i,j;
	double eSum,aSum;
	float eTemp,aTemp;

	// 计算测度
	eSum = 0;
	aSum = 0;
	for(i=0; i<height; i++)
		for(j=0; j<width; j++)
		{
			eTemp = pETemp[i*width+j];
			aTemp = pATemp[i*width+j];
			
			eSum += eTemp * eTemp;
			aSum += aTemp * aTemp;
		}

	// 根据测度,选择系数
	if( eSum>aSum )
	{
		for(i=0; i<height; i++)
			for(j=0; j<width; j++)
				pATemp[i*width+j] = pETemp[i*width+j];
	}
}

// 融合规则二
// 高频融合:系数选择,结果保存在toP中
// 采用能量测度作为系数的估计依据,同时考虑了整体性
void CoeffSelect(float * fromP,float * toP,int width,int height,int size)
{
	//指示,系数取fromP置为T,取toP置为F;
	BOOL * pTemp = (BOOL *)new BOOL[width*height];
	BOOL * pT = (BOOL *)new BOOL[width*height];
	ASSERT(pTemp != NULL && pT != NULL);

	int i,j,m,n,num,length;
	length = size*size;
	BOOL * L = (BOOL *)new BOOL[length];
	ASSERT( L != NULL);
	float temp;
	double fromEnergy,toEnergy;

	for(i=0; i<height; i++)
		for(j=0; j<width; j++)
		{
			// 计算能量测度
			fromEnergy = 0;
			toEnergy = 0;
			for(m=-size/2; m<(size+1)/2; m++)
				for(n=-size/2; n<(size+1)/2; n++)
				{
					temp = fromP[SymFold(i+m,height)*width+SymFold(j+n,width)];
					fromEnergy += temp*temp;
					temp = toP[SymFold(i+m,height)*width+SymFold(j+n,width)];
					toEnergy += temp*temp;
				}
			
			// 判断中心点的选取
			if( fromEnergy > toEnergy )
				pTemp[i*width+j] = TRUE;
			else
				pTemp[i*width+j] = FALSE;
		}
	
	// "众数一致性"调整
	for(i=0; i<height; i++)
		for(j=0; j<width; j++)
		{
			// 取指示
			for(m=-size/2; m<(size+1)/2; m++)
				for(n=-size/2; n<(size+1)/2; n++)
					L[(m+size/2)*size+n+size/2] = pTemp[SymFold(i+m,height)*width+SymFold(j+n,width)];

			// 计算中心周围取法与自己不同的数目
			num = 0;
			for(m=0; m<size; m++)
				for(n=0; n<size; n++)
				{
					if(L[m*size+n] != L[size/2*size+size/2])
						num++;
				}

			// 如该数目>=6,变更中心的取法
			if(num>=6)
				pT[i*width+j] = !pTemp[i*width+j];
			else
				pT[i*width+j] = pTemp[i*width+j];
		}

	// 根据指示确定系数的选择
	for(i=0; i<height; i++)
		for(j=0; j<width; j++)
		{
			if(pT[i*width+j] == TRUE)
				toP[i*width+j] = fromP[i*width+j];
		}
	
	delete pTemp;
	delete pT;
	delete L;
}

// 融合规则三
// 高频融合,结果保存在pA中
// 采用 "相似因子" 和 "显著因子" 综合判断
void SelectCoeff(float * pE,float * pA,int width,int height,float threshold,int size)
{
	// 申请内存,存放融合结果
	float * pTemp = (float *)new float[width*height];
	ASSERT(pTemp != NULL);

	int i,j,m,n;
	float eTemp,aTemp;
	double eEnergy,aEnergy,cEnergy,match;
	float eWeight,aWeight;

	for(i=0; i<height; i++)
		for(j=0; j<width; j++)
		{
			// 初始化
			eEnergy = 0;
			aEnergy = 0;
			cEnergy = 0;
			match = 0;

			// 计算各个模板内的能量
			for(m=-size/2; m<(size+1)/2; m++)
				for(n=-size/2; n<(size+1)/2; n++)
				{
					eTemp = pE[SymFold(i+m,height)*width+SymFold(j+n,width)];
					aTemp = pA[SymFold(i+m,height)*width+SymFold(j+n,width)];

					eEnergy += eTemp * eTemp;								
					aEnergy += aTemp * cEnergy;
					cEnergy += eTemp * aTemp;
				}

			// 计算匹配度
			match = 2*cEnergy/(eEnergy+aEnergy);

			// 判断中心点的选取
			if(match<threshold)
			{
				if(eEnergy>aEnergy)
					pTemp[i*width+j] = pE[i*width+j];
				else
					pTemp[i*width+j] = pA[i*width+j];
			}
			else
			{
				if(eEnergy>aEnergy)
					eWeight = float( 1+(1-match)/match )/2;
				else
					eWeight = float( 1-(1-match)/match )/2;
				aWeight = 1-eWeight;

				pTemp[i*width+j] = eWeight*pE[i*width+j] + aWeight*pA[i*width+j];
			}
		}
	
	// 转存结果
	for(i=0; i<height; i++)
		for(j=0; j<width; j++)
			pA[i*width+j] = pTemp[i*width+j];

	delete pTemp;
}

⌨️ 快捷键说明

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