comlib.cpp

来自「图像处理软件,功能比较基础」· C++ 代码 · 共 2,466 行 · 第 1/4 页

CPP
2,466
字号
	if(! ASSERTVALIDPOINTER(fp, err)) return ;

	fprintf(fp, "%3d\n", n);
	for(int i=0;i<n;i++)
		fprintf(fp, "%3d  %3d %3d   %3d %3d\n", p[i].numb , p[i].x ,p[i].y, p[i].cx,p[i].cy);

	fclose(fp);
	
	return;
}

COORDINATE * CComlib::InputPostData( int* n, CString txtfile)
{
	FILE *fp = fopen(txtfile, "rt"); 
	
	CString err;
	err.Format(" txtfile is not created!\n");
	if(! ASSERTVALIDPOINTER(fp, err)) return  NULL;

	fscanf(fp, "%d", n);
	
	COORDINATE * p = (COORDINATE *) fspace_1d(*n, sizeof(COORDINATE) );
	ASSERT(p != NULL);

	for(int i=0;i<*n;i++)
	{
//		p[i].numb = i;
		fscanf(fp, "%d", &p[i].numb);
		fscanf(fp, "%d", &p[i].x);
		fscanf(fp, "%d", &p[i].y);
		fscanf(fp, "%d", &p[i].cx);
		fscanf(fp, "%d", &p[i].cy);
		
//		TRACE(" \n No. = %d ,pos.x = %d , pos.y = %d, pos.cx = %d , pos.cy = %d", p[i].numb,p[i].x,p[i].y,p[i].cx,p[i].cy);
	}

	fclose(fp);
	
	return p ;
}

BOOL CComlib::CompareImage(CString file1, CString file2, CString outfile)
{
	BOOL  ret = FALSE;
	int r1 ,c1 ;
	int r2 ,c2 ;
	BYTE ** Refimg = InputImageWithName(&r1, &c1, file1);
	ASSERT( Refimg !=NULL);
	BYTE ** Relimg = InputImageWithName(&r2, &c2, file2);
	ASSERT( Relimg != NULL);

	BYTE ** subimg = (BYTE**) fspace_2d(r1,c1,sizeof(BYTE));
	
	if(r1 == r2 && c1 == c2)
	{
		for(int i=0;i<r1;i++)
		for(int j=0;j<c1;j++)
		{
			if( Refimg[i][j] - Relimg[i][j] < 0 )
				subimg[i][j] = 0;
			else
				subimg[i][j] = (BYTE) (Refimg[i][j] - Relimg[i][j] );
		}

		OutputImageWithName(subimg,r1,c1, outfile);

		ret = TRUE;
	}

	ffree_2d((void **) subimg , r1);
	ffree_2d((void **) Refimg , r1);
	ffree_2d((void **) Relimg , r2);

	return ret;
}

BOOL CComlib::AverageImage(CString file1, CString file2, CString outfile)
{
	BOOL  ret = FALSE;
	int r1 ,c1 ;
	int r2 ,c2 ;
	BYTE ** Refimg = InputImageWithName(&r1, &c1, file1);
	ASSERT( Refimg !=NULL);
	BYTE ** Relimg = InputImageWithName(&r2, &c2, file2);
	ASSERT( Relimg != NULL);

	BYTE ** subimg = (BYTE**) fspace_2d(r1,c1,sizeof(BYTE));
	
	if(r1 == r2 && c1 == c2)
	{
		for(int i=0;i<r1;i++)
		for(int j=0;j<c1;j++)
		{
			subimg[i][j] =  (BYTE) (( Refimg[i][j] + Relimg[i][j] + 1) / 2 );
		}

		OutputImageWithName(subimg,r1,c1, outfile);

		ret = TRUE;
	}

	ffree_2d((void **) subimg , r1);
	ffree_2d((void **) Refimg , r1);
	ffree_2d((void **) Relimg , r2);

	return ret;
}

void CComlib::GetNMaxisum(float * * p, int r, int c, int N, NPOT * q)
{
	for(int k = 0 ; k < N ; k++)
	{
		q[k].x = q[k].y =0;
		q[k].cor = p[0][0];
	}

	for(int i=0;i<r;i++)
	for(int j=0;j<c;j++)
	for(int m=0;m<N;m++)
	{
		if (q[m].cor < p[i][j]) 
		{
			for(int k=N-1;k>m;k--)
				q[k]=q[k-1];
			q[m].y = i;
			q[m].x = j;
			q[m].cor = p[i][j];
			break;
		}
	}
}

void CComlib::GetNMinisum(float * * p, int r, int c, int N, NPOT * q)
{
	for(int k = 0 ; k < N ; k++)
	{
		q[k].x = q[k].y =0;
		q[k].cor = p[0][0];
	}

	for(int i=0;i<r;i++)
	for(int j=0;j<c;j++)
	{
		for(int m=0;m<N;m++)
		{
			if (q[m].cor > p[i][j]) 
			{
				for(int k=N-1;k>m;k--)
					q[k] = q[k-1];
				q[m].y = i;
				q[m].x = j;
				q[m].cor = p[i][j];
			
				break;
			}
		}
	}
}

NPOT CComlib::GetMaxisum(float ** p, int r, int c, int step)
{
	float fmax = p[0][0];
	int x=0;
	int y=0;

	int nstep = step+1;

	for(int i=0;i<r;i+=nstep)
	for(int j=0;j<c;j+=nstep)
	{
		if (fmax < p[i][j]) 
		{
			y = i;
			x = j;
			fmax = p[i][j];
		}
	}

	NPOT ret = {x,y, fmax};
	return ret ;
}

NPOT CComlib::GetMinisum(float * * p, int r, int c, int step)
{
	float fmin = p[0][0];
	int x=0;
	int y=0;

	int nstep = step+1;

	for(int i=0;i<r;i+=nstep)
	for(int j=0;j<c;j+=nstep)
	{
		if (fmin > p[i][j]) 
		{
			y = i;
			x = j;
			fmin = p[i][j];
		}
	}

	NPOT ret = {x,y, fmin};
	return ret ;
}

float CComlib::GetMaxisumValue(float ** p, int r, int c)
{
	NPOT local = GetMaxisum(p, r, c);

	return local.cor;
}

float CComlib::GetMinisumValue(float ** p, int r, int c)
{
	NPOT local = GetMinisum(p, r, c);

	return local.cor;
}

NPOT CComlib::GetMaxisum(float * p, int r, int c, int step)
{
	float fmax = p[0];
	int x=0;
	int y=0;

	int nstep = step+1;

	for(int i=0;i<r;i+=nstep)
	for(int j=0;j<c;j+=nstep)
	{
		if (fmax < p[i*c + j]) 
		{
			y = i;
			x = j;
			fmax = p[i*c + j];
		}
	}

	NPOT ret = {x,y, fmax};
	return ret ;
}

NPOT CComlib::GetMinisum(float * p, int r, int c, int step)
{
	float fmin = p[0];
	int x=0;
	int y=0;

	int nstep = step+1;

	for(int i=0;i<r;i+=nstep)
	for(int j=0;j<c;j+=nstep)
	{
		if (fmin > p[i*c + j])
		{
			y = i;
			x = j;
			fmin = p[i*c + j];
		}
	}

	NPOT ret = {x,y, fmin};
	return ret ;
}

BOOL CComlib::NormalizeToByte(float * * p, int r, int c, CString outfile, BOOL bVert)
{
	if(p==NULL) return FALSE;

	//输出相关面到文件;可以去掉,归一化时不需反向。
	BYTE**  q = (BYTE ** ) fspace_2d( r , c , sizeof(BYTE));

	NPOT pqmax[1] , pqmin[1];
	GetNMaxisum(p, r,c, 1 , pqmax);
	GetNMinisum(p, r,c, 1 , pqmin);
	double pmax = pqmax[0].cor;
	double pmin = pqmin[0].cor;

	for (int i=0;i<r;i++) 
	for (int j=0;j<c;j++) 
	{
		if ( pmax >= -pmin ) 
			q[i][j] = (BYTE)(255*(p[i][j]-pmin)/(pmax - pmin));
		else if(bVert)
			q[i][j] = (BYTE)(255-(255*(p[i][j]- pmin)/(pmax - pmin)));
		else
			q[i][j] = (BYTE)(255*(p[i][j]-pmin)/(pmax - pmin));
	}

	OutputImageWithName( q , r,c, outfile);

	ffree_2d( (void**) q , r );

	return TRUE;
}

BOOL CComlib::NormalizeToByte3(float * * p, int r, int c, CString outfile)
{
	if(p==NULL) return FALSE;

	//输出相关面到文件;可以去掉,归一化时不需反向。
	BYTE**  q = (BYTE ** ) fspace_2d( r , c , sizeof(BYTE));

	for (int i=0;i<r;i++) 
	for (int j=0;j<c;j++) 
	{
		if ( p[i][j] > 0 ) 
			q[i][j] = 200;
		else if ( p[i][j] == 0 ) 
			q[i][j] = 100;
		else 
			q[i][j] = 50;
	}

	OutputImageWithName( q , r,c, outfile);

	ffree_2d( (void**) q , r );

	return TRUE;
}

BOOL CComlib::NormalizeToByte(float** p, BYTE** q, int r, int c, BOOL bVert)
{
	if(p==NULL || q==NULL) return FALSE;

	NPOT pqmax[1] , pqmin[1];
	GetNMaxisum(p, r,c, 1 , pqmax);
	GetNMinisum(p, r,c, 1 , pqmin);
	double pmax = pqmax[0].cor;
	double pmin = pqmin[0].cor;

	for (int i=0;i<r;i++) 
	for (int j=0;j<c;j++) 
	{
		if ( pmax >= -pmin ) 
			q[i][j] = (BYTE)(255*(p[i][j]-pmin)/(pmax - pmin));
		else if(bVert)
			q[i][j] = (BYTE)(255-(255*(p[i][j]- pmin)/(pmax - pmin)));
		else
			q[i][j] = (BYTE)(255*(p[i][j]-pmin)/(pmax - pmin));
	}

	return TRUE;
}

BOOL CComlib::NormalizeToByte(float * p, int r, int c, CString outfile, BOOL bVert)
{
	if(p==NULL) return FALSE;

	//输出相关面到文件;可以去掉,归一化时不需反向。
	BYTE**  q = (BYTE ** ) fspace_2d( r , c , sizeof(BYTE));

	NPOT pqmax , pqmin;
	pqmax = GetMaxisum(p, r,c);
	pqmin = GetMinisum(p, r,c);
	float pmax = pqmax.cor;
	float pmin = pqmin.cor;

	for (int i=0;i<r;i++) 
	for (int j=0;j<c;j++) 
	{
		if ( pmax >= -pmin ) 
			q[i][j] = (BYTE)(255*(p[i*c+j]-pmin)/(pmax - pmin));
		else if(bVert)
			q[i][j] = (BYTE)(255-(255*(p[i*c+j]- pmin)/(pmax - pmin)));
		else
			q[i][j] = (BYTE)(255*(p[i*c+j]-pmin)/(pmax - pmin));
	}

	OutputImageWithName( q , r,c, outfile);

	ffree_2d( (void**) q , r );

	return TRUE;
}

#define  COEFFLAG   0x1651
#define  B_TYPE     0x1
#define  L_TYPE     0x2
#define  ADDOFF     0x0

// 按DSP板LOAD & SAVE格式保存数据
void CComlib::SaveAsDspDataFile(void * data, int size, DWORD address, CString outfile, char cTYPE)
{
	FILE *fp;
	if( (fp = fopen( outfile, "wt+" )) == NULL )
	{
		AfxMessageBox("can not open hexdat file to write!");
		return;
	}

	DWORD * p =(DWORD*) data;
	switch(cTYPE)
	{
		int k ;
	case 'b':  // Save image datas(BYTE) as DWORD
		fprintf(fp,"%x %x %x %x %x\n",
			COEFFLAG, B_TYPE , address , ADDOFF, size);
		for( k=0;k<(size+3)/4;k++)
			fprintf(fp,"0x%.8x\n", p[k]);

		break;
	case 'd':  // save int datas as DWORD
		fprintf(fp,"%x %x %x %x %x\n",
			COEFFLAG, L_TYPE , address , ADDOFF, 4*size);
		for( k=0;k<size;k++)
			fprintf(fp,"%d\n", p[k]);

		break;
	case 'l':  // save long datas as DWORD 
		fprintf(fp,"%x %x %x %x %x\n",
			COEFFLAG, L_TYPE , address , ADDOFF, 4*size);
		for( k=0;k<size;k++)
			fprintf(fp,"%d\n",p[k]);

		break;
	default:
		break;
	}

	fclose(fp);
	return ; 
}

// 按DSP板LOAD & SAVE数据格式装载数据
void CComlib::LoadAsDspDataFile(void * data, int *psize, CString outfile, char cType)
{
	FILE *fp;
	if( (fp = fopen( outfile, "rt" )) == NULL )
	{
		AfxMessageBox("can not open hexdat file to write!");
		return;
	}

	DWORD *p = (DWORD*) data;

	fscanf(fp,"%d", psize);
	int   size = *psize;

	switch(cType)
	{
		int k ;
	case 'b':  // load image BYTE data BY DWORD
		for( k=0;k<(size+3)/4;k++)
			fscanf(fp,"%d",&p[k]);

		break;
	case 'd':  // load int data by DWORD
		for( k=0;k<size/4;k++)
			fscanf(fp,"%d", &p[k]);

		break;
	case 'l':  // save int(32) one by one
		for( k=0;k<size/4;k++)
			fscanf(fp,"%d", &p[k]);

		break;
	default:
		break;
	}

	fclose(fp);
	return ; 
}

// 统计直方图
int * CComlib::Histogram(BYTE * * image, BYTE ** Mask , int r, int c)
{
	int * ret = (int * )fspace_1d( 256 , sizeof(int));

	for(int k = 0 ;k<256;k++) ret[k] = 0;

	for(int i = 0 ;i<r;i++)
	for(int j = 0 ;j<c;j++)
		if(Mask[i][j] == 255)
			ret[image[i][j]] ++;

	return ret;
}

// 计算标准差
float CComlib::Deviation(BYTE * * image, BYTE * * Mask, int r, int c)
{
	float SumX = 0;
	float SumXX = 0;
	int counts = 0;
	float dev ;

	if(Mask==NULL)  // 统计整个图象
	{
		for(int i = 0 ;i<r;i++)
		for(int j = 0 ;j<c;j++)
		{
			counts ++ ;
			SumX += image[i][j] ;
			SumXX += image[i][j] * image[i][j];
		}
	}
	else
	{
		for(int i = 0 ;i<r;i++)
		for(int j = 0 ;j<c;j++)
		{
			if(Mask[i][j] == 255)
			{
				counts ++ ;
				SumX += image[i][j] ;
				SumXX += image[i][j] * image[i][j];
			}
		}
	}

	dev = (SumXX - SumX*SumX/counts) / sqrt(counts -1);
	
	return dev;
}

// 统计高斯分布数据的均值和标准差Sigma
void CComlib::GuassStatics(float *p, int length , float &avg, float &dev)
{
	float SumX = 0;
	float SumXX= 0;
	for(int i=0;i<length;i++)
	{
		SumX += p[i];
		SumXX += p[i]*p[i];
	}

	avg = SumX/length;
	dev = sqrt( (SumXX - SumX*SumX/length)/(length-1));

	return;
}

// 计算均值
float CComlib::Average(BYTE * * image, BYTE * * Mask, int r, int c)
{
	float SumX = 0;
	int counts = 0;
	float avg ;

	if(Mask==NULL)  // 统计整个图象
	{
		for(int i = 0 ;i<r;i++)
		for(int j = 0 ;j<c;j++)
		{
			counts ++ ;
			SumX += image[i][j] ;
		}
	}
	else
	{
		for(int i = 0 ;i<r;i++)
		for(int j = 0 ;j<c;j++)
		{
			if(Mask[i][j] == 255)
			{
				counts ++ ;
				SumX += image[i][j] ;
			}
		}
	}

	
	avg  = SumX/counts;
	
	return avg;
}

BYTE * CComlib::Trans2To1( BYTE ** p, CSize s)
{
	BYTE * q = (BYTE *) fspace_1d(s.cy*s.cx, sizeof(BYTE));
	int k=0;
	for(int i = 0;i<s.cy;i++)
	for(int j = 0;j<s.cx;j++)
		q[k++] = p[i][j];

	return q;
}

BYTE ** CComlib::Trans1To2( BYTE * p, CSize s)
{
	BYTE ** q = (BYTE **) fspace_2d(s.cy, s.cx, sizeof(BYTE));

	int k=0;
	for(int i = 0;i<s.cy;i++)
	for(int j = 0;j<s.cx;j++)
		q[i][j] = p[k++];

	return q;
}

BYTE ** CComlib::PreProcess(BYTE ** Src , int row , int col , int nHalfSize)
{
	int total;
	float ** fimg = (float **) fspace_2d(row, col, sizeof(float));
	BYTE  ** Des = (BYTE **)  fspace_2d(row, col, sizeof(BYTE));
	
	for(int i=0;i<row;i++)
	for(int j=0;j<col;j++)
	{
		total = 0;
		for(int m=-nHalfSize;m<=nHalfSize;m++)
		for(int n=-nHalfSize;n<=nHalfSize;n++)
		{
			int k=i+m;
			int l=j+n;
			if (k<0||k>=row) k=i-m;
			if (l<0||l>=col) l=j-n;
			total+=Src[k][l];
		}
		fimg[i][j] = (float)Src[i][j]-(float)total/(nHalfSize*2+1)/(nHalfSize*2+1);
	}

	float max= -255;
	float min = 255;
	for(i=0;i<row;i++)

⌨️ 快捷键说明

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