求助。。。。。 帮忙解决一下 编译时 有问题
#include
#include
#include
#include
#include
#define MB_SIZE 16
#define BLOCK_SIZE 8
#define PI (4.*atan(1.))
//---//
#define W 3
// image resolution
int pels; // number of pixel in a line (Y)
int lines; // number of lines in a picture (Y)
int im_size; // number of pixel in a picture (Y)
int cpels; // number of pixel in a line (Cb or Cr)
int clines; // number of lines in a picture (Cb or Cr)
int cim_size; // number of pixel in a picture (Cb or Cr)
int p_blocks;//number of blocks in a line (Y)
int l_blocks;//number of blocks (Y)
// initialize picture parameters
void Initialize (char inf1[100], char inf2[100] , char *argv[], int *p_quant);
void ReadImage (int frame_no , char inf[100], unsigned char *lum, unsigned char *cb, unsigned char *cr);
void WriteImage (int frame_no, char outf[100], unsigned char *re_lum, unsigned char *re_cb, unsigned char *re_cr);
double Weighting(double x);
double Constrst_dis(double x , double y , double z );
double Lum_dis(unsigned char *p_block , unsigned char *q_block ,double x ,double y);
double Average( unsigned char *p_block );
double Variance(unsigned char *p_block , double x);
double Covariance (unsigned char *p_block, unsigned char *q_block ,double x,double y );
//-----//
double Function1(double sum1 , double sum2,double sum3,double sum4,double sum5,double sum6);
double Function2(unsigned char *a[3] , unsigned char *b[3], int c[3]);
void main (int agrc, char *argv[])
{
unsigned char *lum1, *cb1, *cr1;
unsigned char *lum2, *cb2, *cr2;
char inputfile1[100];
char inputfile2[100];
int i, j, r, s , k , p11[3], p22[3],p_quant ;
double ait , ct , pdmt , wt , pdmf, pqm , sum1 , sum2 , sum3, sum4, sum5, sum6, ux1 ,uy1, k1;
double qx , qx1, qy , qxy ;
unsigned char *p1[3], *p2[3], *p, *q;
double M1, M2, M3, DDM, Dt;
double f1 , f2 , Quality , ZMA , NZMA;
Initialize (inputfile1, inputfile2, argv, &p_quant);
// memory allocation, 2-D --> 1-D
lum1 = (unsigned char *)malloc(im_size*sizeof(unsigned char));
cb1 = (unsigned char *)malloc(cim_size*sizeof(unsigned char));
cr1 = (unsigned char *)malloc(cim_size*sizeof(unsigned char));
p1[0] = (unsigned char *)malloc(im_size*sizeof(unsigned char));
p1[1] = (unsigned char *)malloc(im_size*sizeof(unsigned char));
p1[2] = (unsigned char *)malloc(im_size*sizeof(unsigned char));
p2[0] = (unsigned char *)malloc(im_size*sizeof(unsigned char));
p2[1] = (unsigned char *)malloc(im_size*sizeof(unsigned char));
p2[2] = (unsigned char *)malloc(im_size*sizeof(unsigned char));
lum2 = (unsigned char *)malloc(im_size*sizeof(unsigned char));
cb2 = (unsigned char *)malloc(cim_size*sizeof(unsigned char));
cr2 = (unsigned char *)malloc(cim_size*sizeof(unsigned char));
ait = 0.;
ct = wt = pdmt = pdmf = pqm = sum1 = sum2 = sum3 = sum4 = sum5 = sum6 = ux1 =uy1 = ait;
qx = qx1 = qy = qxy =0;
M1 = M2 = M3 = DDM = Dt = 0.;
k1 = 0.025*0.025;
f1 = f2 = Quality = ZMA = NZMA = 0.;
for(k=0; k<100; k++)
{
ReadImage (k , inputfile1, lum1, cb1, cr1);
//---zhifangtu fucnction----//
for(j = 0; j < pels; j ++)
for(i = 0; i < lines; i ++)
{
if (lum1[i + j * pels] >= '0' && lum1[i + j * pels] <='85')
{
*(p1[0]+ i + j * pels) = lum1[i + j * pels];
sum1 += lum1[i + j * pels];
p11[0]++;
}
else if (lum1[i + j * pels] >= '86' && lum1[i + j * pels] <='170')
{
*(p1[1]+ i + j * pels) = lum1[i + j * pels];
sum2 += lum1[i + j * pels];
p11[1]++;
}
else
{
*(p1[2]+i + j * pels) = lum1[i + j * pels];
sum3 += lum1[i + j * pels];
p11[2]++;
}
}
sum1 = sum1/p11[0];
sum2 = sum2/p11[1];
sum3 = sum3/p11[2];
ReadImage (k , inputfile2, lum2, cb2, cr2);
for(j = 0; j < pels; j ++)
for(i = 0; i < lines; i ++)
{
if (lum2[i + j * pels] >= '0' && lum2[i + j * pels] <='85')
{
*(p2[0]+i + j * pels) = lum2[i + j * pels];
sum4 += lum2[i + j * pels];
p22[0]++;
}
else if (lum2[i + j * pels] >= '86' && lum2[i + j * pels] <='170')
{
*(p2[1]+i + j * pels) = lum2[i + j * pels];
sum5 += lum2[i + j * pels];
p22[1]++;
}
else
{
*(p2[2]+i + j * pels) = lum2[i + j * pels];
sum6 += lum2[i + j * pels];
p22[2]++;
}
}
sum4 = sum4/p22[0];
sum5 = sum5/p22[1];
sum6 = sum6/p22[2];
//-----M1,M2-----//
M1 = Function1(sum1, sum2, sum3, sum4, sum5 , sum6);
M2 = Function2(p1, p2, p11);
printf("M2 = %f\n",M2);
for(j = 0 ; j < 96; j++)
{
for(i =0 ; i< 96 ; i++)
{
lum2[i + j * pels] /= p_quant;
}
}
for (r = 0; r < p_blocks ; r ++)
{
for (s = 0; s < l_blocks ; s ++)
{
p = &lum1[ r * 8 * pels + s * 8];
q = &lum2[ r * 8 * pels + s * 8];
ux1 = Average( p );
uy1 = Average( q ); //the mean of the luminance on the block
qx = Variance( p , ux1);
qy = Variance( q, uy1);// the variance of the luminance on the block
qxy = Covariance(p, q , ux1, uy1 );//the covariance of the lum on the block
//-----//
sum3 = qxy/(qx*qy + k1);
sum4 += sum3;
M3 = sum4/(p_blocks * l_blocks);
//-----//
wt= Weighting ( ux1 ); // the weighting factor
ait = Lum_dis( p, q, ux1 ,uy1); // the lum distortion
ct = Constrst_dis( qx, qy, qxy ); // the constrst distortion
pdmt = ct * ait ; // the block level perceptual distorion
sum1 += wt * pdmt;
sum2 += wt;
}
}
pdmf = sum1/sum2; // the frame level perceptual distorion
pqm = 1 - pdmf;
if( pqm < 0 )
{
pqm = 0. ;
printf("the result is: 0 .\n");
}
else
printf("The result of the %3d-th frame is : %f \n ", k, pqm);
DDM += M3/(M1*M2+1);
}
DDM = DDM/100;
Dt = DDM*pqm;
printf ("the Dt is %f\n", Dt);
//------Combined Colour-Depth Quality Evaluation----//
ux1 = qx = qx1 = 0.;
for (r = 0; r < p_blocks ; r ++)
{
for (s = 0; s < l_blocks ; s ++)
{
for(k=0; k<100; k++)
{
p = &lum1[k*pels* lines + r * 8 * pels + s * 8];
ux1 = Average( p );
qx1 += lum1[ k*pels*lines+ r * 8 * pels + s * 8]-ux1;
}
qx1 = sqrt(qx1/100 );
ZMA += qx1;
}
}
NZMA = ZMA/(pels*lines*255);
f1 = 1 - 0.997*pow(NZMA , 0.2393);
f2 = 0.997* pow(NZMA , 0.2393);
Quality = f1*pqm + f2*DDM;
printf("The result of the Quality is : %f \n ", Quality);
return;
}
void Initialize (char inf1[100], char inf2[100], char *argv[], int *p_quant)
{
pels = 640;
lines = 1024;
cpels = pels/2;
clines = lines/2;
p_blocks = pels/BLOCK_SIZE;
l_blocks = lines/BLOCK_SIZE;
im_size = pels*lines;
cim_size = cpels*clines;
strcpy (inf1,argv[1]);
strcpy (inf2,argv[2]);
*p_quant = atoi(argv[3]);
return ;
}
void ReadImage (int frame_no , char inf[100], unsigned char *lum, unsigned char *cb, unsigned char *cr)
{
FILE *fin = NULL;
fin = fopen(inf, "rb");
if (fin == NULL)
{
fprintf(stderr,"\n%s file open failure !!!\n", inf);
exit (0);
}
fseek(fin, sizeof(unsigned char) * im_size*3/2 * frame_no, 0);
fread (lum, sizeof(unsigned char), im_size, fin);
fread (cb, sizeof(unsigned char), cim_size, fin);
fread (cr, sizeof(unsigned char), cim_size, fin);
fclose (fin);
}
void WriteImage (int frame_no, char outf[100], unsigned char *lum, unsigned char *cb, unsigned char *cr)
{
FILE *fout = NULL;
if (frame_no == 0)
{
fout = fopen(outf, "wb");
}
else
{
fout = fopen(outf, "ab");
}
if (fout == NULL)
{
fprintf(stderr,"\n%s file open failure !!!\n", outf);
exit (0);
}
fwrite (lum, sizeof(unsigned char), im_size, fout);
fwrite (cb, sizeof(unsigned char), cim_size, fout);
fwrite (cr, sizeof(unsigned char), cim_size, fout);
fclose (fout);
}
double Average( unsigned char *p_block )
{
int i , j;
double sum , ux;
sum = ux = 0.;
for(j = 0 ; j < BLOCK_SIZE; j++)
{
for(i =0 ; i< BLOCK_SIZE; i++)
{
sum += *(p_block+ i + j * pels);
}
}
ux = sum/64.;
return ux ;
}
double Variance(unsigned char *q_block , double x)
{
int i , j;
double sum;
sum = 0.;
for(j = 0; j < BLOCK_SIZE; j ++)
{
for(i = 0; i < BLOCK_SIZE; i ++)
{
sum += ( *(q_block +i + j * pels)-x)*(*(q_block +i + j * pels)-x);
}
}
sum = sqrt( sum / (BLOCK_SIZE*BLOCK_SIZE-1));
return sum ;
}
//the variance of the block
double Covariance (unsigned char *p_block , unsigned char *q_block , double x , double y )
{
int i , j;
double sum;
sum = 0.;
for(j = 0; j < BLOCK_SIZE; j ++)
{
for(i = 0; i < BLOCK_SIZE; i ++)
{
sum += ( *(p_block +i + j * pels) - x ) * ( *(q_block +i + j * pels) - y );
}
}
sum = sum / (BLOCK_SIZE*BLOCK_SIZE-1);
return sum;
}
//the covariance of the lum on the block
double Lum_dis(unsigned char *p_block , unsigned char *q_block, double x , double y)
{
int i , j;
double sum;
sum=0.;
if (x <= 1 && y <= 1)
sum = 0.;
else if (x<=1 && y > 1)
sum = BLOCK_SIZE*BLOCK_SIZE;
else
for(j = 0 ; j < BLOCK_SIZE ; j ++)
{
for(i = 0; i < BLOCK_SIZE ; i ++)
{
sum = ( ( *(p_block +i + j * pels) -*(q_block +i + j * pels) ) * ( *(p_block +i + j * pels) -*(q_block +i + j * pels) ) ) / x;
sum += pow( sum , 2);
}
}
sum = sum/64.;
return sum;
}//the lum distorition is calculated
double Weighting( double x )
{
double sum;
sum = 0.;
if( x == 0 )
sum = 1.;
else
sum = 255/x ;
return sum;
}//the weighting factor is calculated
double Constrst_dis(double x , double y , double z)
{
double sum , sum0 ;
sum = sum0 = 0.;
sum0 = pow ( ( x * x - y * y ) , 2 ) + 255 ;
sum = pow ( x , 4 ) + pow (y , 4 ) - 2 * pow ( z , 2 ) + 255;
sum = 1 + sum0/sum;
return sum;
}// the distortion in contrast
//-------DDM--------//
double Function1(double sum1 , double sum2,double sum3,double sum4,double sum5,double sum6)
{
int kn, kf;
double sum, ddr;
kn = 255;
kf = 0;
sum = 0.;
ddr = 0.;
ddr = (kn*W + kf*W)/255*fabs((sum1-sum2)-(sum4-sum5));
sum += ddr;
ddr = (kn*W + kf*W)/255*fabs((sum2-sum3)-(sum5-sum6));
sum += ddr;
return sum;
}
double Function2(unsigned char *a[3], unsigned char *b[3], int c[3])
{
double sum, sum1, sum2, sum3, u;
double sum_diff[3][640*1024];
int i , j;
sum = sum1 = sum2 = sum3 = u = 0.;
sum_diff[3][640*1024] = 0.;
for(i = 0; i< 3; i ++)
{
for(j = 0; j< c[i]; j++)
{
sum_diff[i ][j]= a[i][j] - b[i][j];
sum1 += sum_diff[i][j];
}
u = sum1/c[i];
for(j = 0; j< c[i] ; j++)
sum2 += sum_diff[i][ j] - u;
sum2 = sum2/c[i];
sum3 +=sqrt(sum2);
sum += sum3;
}
return sum;
}
//-------//