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

📄 矩特征.c

📁 算法代码
💻 C
字号:
//////////////////////////////////////////////////////////////////////////
//得到Moment特征
//lpDIBBits是经过二值化处理以后的图像指针
//lWidth不必是4的倍数
//pFeature是长度为8的实数数组
BOOL WINAPI GetMomentFeatures (LPSTR lpDIBBits, LONG lWidth, LONG lHeight, double *pFeature)
{
	//**********************************************************************
	//下面这一段是标准代码,可以用在每个函数的开头
	LONG lLineBytes;	//每行的字节数
	lLineBytes = WIDTHBYTES(lWidth * 8);
	unsigned char **cTemp;
	cTemp = cmatrix(0, lHeight-1, 0, lLineBytes-1);//提取信息可以用这个数组
	unsigned char* pmid = (unsigned char *) lpDIBBits;
	long i,j;
	
	for(i = 0; i < lHeight; i++)
	{
		for(j = 0; j < lLineBytes; j++)
		{
			cTemp[i][j] = *pmid;
			pmid++;
		}
	}
	//标准代码结束
	//***********************************************************************

	double pi = 3.1415926535;
	double fg1,fg2,fg3,fg4,fg5,fg6,fg7,fg8;
	int x,y;
	double theta; //angle
	double lm1,lm2;
	double u00=0,u02=0,u20=0,u11=0;
	double u03a=0,u03s=0,u03;//u03a>0,u03s<0
	double u30a=0,u30s=0,u30;//u30a>0,u30s<0
	double u12a=0,u12s=0,u12;//u12a>0,u12s<0
	double u21a=0,u21s=0,u21;//u21a>0,u21s<0
	double size;
	double xmax=0,xmin=10000000.0,ymax=0,ymin=100000000.0;
	double xav=0,yav=0;

	int ndots = 0;
	for( y = 0; y < lHeight; y++ )
	{
		for( x = 0; x < lWidth; x++ )
		{
			if(cTemp[y][x] == 1)
			{
				ndots++;
				xav+= x;
				yav+= y;
			}
		}
	}

	xav/=(double)ndots;
	yav/=(double)ndots;

	for( y = 0; y < lHeight; y++ )
	{
		for( x = 0; x < lWidth; x++ )
		{
			if(cTemp[y][x] == 1)
			{
				if(x>xmax)
					xmax=x;
				if(x<xmin)
					xmin=x;
				if(y>ymax)
					ymax=y;
				if(y<ymin)
					ymin=y;
			
				//add u02,u20......
				u02+=(y-yav)*(y-yav);
				u20+=(x-xav)*(x-xav);
				u11+=(x-xav)*(y-yav);
		
				u30=(x-xav)*(x-xav)*(x-xav);
				if(u30>0)
					u30a+=u30;
				else
					u30s-=u30;
			
				u03=(y-yav)*(y-yav)*(y-yav);
				if(u03>0)
					u03a+=u03;
				else
					u03s-=u03;
			
				u12=(x-xav)*(y-yav)*(y-yav);
				if(u12>0)
					u12a+=u12;
				else
					u12s-=u12;
			
				u21=(x-xav)*(x-xav)*(y-yav);
				if(u21>0)
					u21a+=u21;
				else
					u21s-=u21;
			}
		}
	}
	
	u30 = u30a - u30s;
	u03 = u03a - u03s;
	u21 = u21a - u21s;
	u12 = u12a - u12s;
	
	double yt02 = u02 / (double) ndots; 
	double yt20 = u20 / (double) ndots;
	double yt03 = u03 / (double) ndots;
	double yt30 = u30 / (double) ndots;
	double yt12 = u12 / (double) ndots;
	double yt21 = u21 / (double) ndots;
	double yt11 = u11 / (double) nodts;
	
	fg1 = yt20 + yt02;
	
	double temp, temp1;
	temp = yt20 - yt02;
	fg2 = temp * temp + 4 * yt11 * yt11;
	
	temp = yt30 - 3 * yt12;
	temp1 = 3 * yt21 + yt03;
	fg3 = temp * temp + temp1 * temp1;
	
	temp = yt30 + yt12;
	temp1 = yt21 + yt03;
	fg4 = temp * temp + temp1 * temp1;
	
	temp = yt30 + yt12;
	temp1 = yt21 + yt03;
	fg5 = (yt30 - 3 * yt12)(yt30 + yt12)(temp * temp - 3 * temp1 * temp1)
		+ (3 * yt21 - yt03)(yt21 + yt03)(3 * temp * temp - temp1 * temp1);
		
	fg6 = (yt20 - yt02)(temp * temp - temp1 * temp1)
		+ 4 * yt11 * temp * temp1;
		
	fg7 = (3 * yt12 - yt30) + temp * (temp * temp - 3 * temp1 * temp1)
		+ (3 * yt11 - yt03) * (yt21 + yt03) * (3 * temp * temp - temp1 * temp1)
	
	pFeature[0] = fg1;
	pFeature[1] = fg2;
	pFeature[2] = fg3;
	pFeature[3] = fg4;
	pFeature[4] = fg5;
	pFeature[5] = fg6;
	pFeature[6] = fg7;

	return true;

	free_cmatrix(cTemp, 0, lHeight-1, 0, lLineBytes-1);
}

double MomentFeagureDistance(double* feagure1, double* feagure2)
{
	double dist=0.0;
	
	dist+=fabs(feagure1[0] - feagure2[0]);
	dist+=fabs(feagure1[1] - feagure2[1]);
	dist+=fabs(feagure1[2] - feagure2[2]);
	dist+=fabs(feagure1[3] - feagure2[3]);
	dist+=fabs(feagure1[4] - feagure2[4]);
	dist+=fabs(feagure1[5] - feagure2[5]);
	dist+=fabs(feagure1[6] - feagure2[6]);
	
	return dist;
}

/*****************************************************************************
 * 函数名称:cmatrix
 * 功能:申请一个无符号字符型二维数组(矩阵)
 * 参数:nrl:数组的行最低下标
 *       nrh:数组的行最高下标
 *       ncl:数组的列最低下标
 *       nch:数组的列最高下标
 * 返回:数组地址
 */
unsigned char **cmatrix(long nrl,long nrh,long ncl,long nch)
{
	int i;
	unsigned char **m;

	m=(unsigned char **) calloc((unsigned) (nrh-nrl+1),sizeof(unsigned char*));
	if (!m) nrerror("allocation failure 1 in dmatrix()");
	m -= nrl;

	for(i=nrl;i<=nrh;i++) {
		m[i]=(unsigned char *) calloc((unsigned) (nch-ncl+1),sizeof(unsigned char));
		if (!m[i]) nrerror("allocation failure 2 in dmatrix()");
		m[i] -= ncl;
	}
	return m;
}


/*****************************************************************************
 * 函数名称:free_cmatrix
 * 功能:释放一个无符号字符二维数组(矩阵)
 * 参数:m:原数组地址
 *       nrl:数组的行最低下标
 *       nrh:数组的行最高下标
 *       ncl:数组的列最低下标
 *       nch:数组的列最高下标
 * 无返回值
 */
void free_cmatrix(unsigned char **m,long nrl,long nrh,long ncl,long nch)
{
	int i;

	for(i=nrh;i>=nrl;i--) free((char*) (m[i]+ncl));
	free((char*) (m+nrl));
}

⌨️ 快捷键说明

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