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 + -
显示快捷键?