/*************************************************************************
*
* 函数名称:
* GetImage()
*
* 参数:
*
* 返回值:
* 无
* 函数功能:
* 说明:
* 本程序用于方向场中区域块的截取
*
************************************************************************/
void GetImage(int** gradx,int** grady,int Width,int Height,int* gx,int* gy,int strx,int stry)
{
int index=0;
for (int i=0;i<Height;i++)
{
for (int j=0;j<Width;j++)
{
if(i>=stry && i<(stry+10) && j>=strx && j<(strx+10))
{
*(gx+index)=gradx[i][j];
*(gy+index)=grady[i][j];
index++;
}
}
}
}
/*************************************************************************
*
* 函数名称:
* fxc()
*
* 参数:
*
* 返回值:
* 无
* 函数功能:
* 说明:
* 本程序计算图像的方向场,方向场计算块大小为10*10,采样间隔为5*5像素
* 图像大小为w*h,w=a*5+7;h=b*5+7
*
************************************************************************/
void fxc(BYTE* ImageData,float** fxcsz,int Width,int Height)
{
int** gradx=new int*[Height];
int** grady=new int*[Height];
for (int i=0;i<Height;i++)
{
gradx[i]=new int[Width];
grady[i]=new int[Width];
}
for (int i=0;i<Height;i++)
{
for (int j=1;j<Width;j++)
{
gradx[i][j]=0;
grady[i][j]=0;
}
}
td(ImageData, Width, Height,gradx,grady);
int fxcsize=((Width-7)/5)*((Height-7)/5);
float* fxcsz=new float[fxcsize];
int* xj=new int[100];
int* yj=new int[100];
int sumgradx=0;
int sumgrady=0;
int sumgradxy=0;
int index=0;
for (int i=1;i<Height-10;i=i+5)
{
for (int j=1;j<Width-10;j=j+5)
{
GetImage(gradx,grady,Width,Height,xj,yj,j,i);
for(int kk=0;kk<100;kk++)
{
sumgradx+=*(xj+kk)*(*(xj+kk));
sumgrady+=*(yj+kk)*(*(yj+kk));
sumgradxy+=*(xj+kk)*(*(yj+kk));
}
int fm=sumgradx-sumgrady;
int fz=2*(sumgradxy);
if(fm==0)
{
fm=1;
}
*(fxcsz+index)=0.5*atan(fz/fm);
index++;
}
}
delete[] xj;
xj=NULL;
delete[] yj;
yj=NULL;
for (int i=0;i<Height;i++)
{
delete[] gradx[i];
delete[] grady[i];
gradx[i]=NULL;
grady[i]=NULL;
}
delete[] gradx;
gradx=NULL;
delete[] grady;
grady=NULL;
}