#include <stdio.h>
#include <iostream.h>
#include <math.h>
#define cif
#ifdef qcif
#define Y_WIDTH 176
#define Y_HEIGHT 144
#define U_WIDTH 88
#define U_HEIGHT 72
#define V_WIDTH 88
#define V_HEIGHT 72
#endif
#ifdef cif
#define Y_WIDTH 124
#define Y_HEIGHT 87
#define U_WIDTH 720
#define U_HEIGHT 576
#define V_WIDTH 720
#define V_HEIGHT 576
#endif
void ReadImage(unsigned char *pImage,char *cFileName,int nWidth,int nHeight,long offset);
float snr[Y_HEIGHT/16][Y_WIDTH/16];
double GBIM( int **pImage);
unsigned char Y_space1[Y_WIDTH*Y_HEIGHT];
unsigned char Y_space2[Y_WIDTH*Y_HEIGHT];
//unsigned char U_space[U_WIDTH*U_HEIGHT];
//unsigned char V_space[V_WIDTH*V_HEIGHT];
void main()
{int i,j,u,v;
int imageno;
long origin;
int diff_y,diftemp;
int ** Y_value;
// printf("Y_HEI=%d\n",Y_HEIGHT);
Y_value = new int * [Y_HEIGHT];
double GBIM_value[26];
double ave=0;
for(i=0;i<Y_HEIGHT;i++)
{
Y_value[i] = new int[Y_WIDTH];
}
for (imageno=1;imageno<26;imageno++)
{
origin=(imageno-1)*(Y_WIDTH*Y_HEIGHT+U_WIDTH*U_HEIGHT+V_WIDTH*V_HEIGHT);
printf(" %d\n",imageno);
printf(" %d\n",origin);
ReadImage(Y_space2,"E:\\images.jpg",Y_WIDTH,Y_HEIGHT,origin);
//将Y分量存储为二维数组,以便后面操作
for(int m=0;m<Y_HEIGHT;m++)
{
for(int n=0;n<Y_WIDTH;n++)
Y_value[m][n]=Y_space2[m*Y_WIDTH+n];
}
//GBIM块效应估计值
GBIM_value[imageno] = GBIM(Y_value);
//cout<<GBIM_value[imageno]<<endl;
ave+=GBIM_value[imageno];
}
ave=ave/25;
cout<<ave<<endl;
}
void ReadImage(unsigned char *pImage,char *cFileName,int nWidth,int nHeight,long offset)
{
int j,i;
unsigned char *pWork;
FILE *fp=0;
if ( fp=fopen(cFileName,"rb" ) ) //打开一幅图像
{
fseek(fp,offset,SEEK_SET); //文件定位
pWork=pImage; //指针指向
for ( j=0;j<nHeight;j++,pWork+=nWidth )
for ( i=0;i<nWidth;i++ )
fread(pWork+i,1,1,fp); //顺序读取
fclose(fp);
}
}
//GBIM方法估计块效应
double GBIM( int **I)
{
int nWidth=Y_WIDTH;
int nHeight=Y_HEIGHT;
int i,j,k,n;
int I_trans[Y_WIDTH][Y_HEIGHT];
double Weighted_Value_v=0;
double Weighted_Value=0;
double Weighted_Value_interpixel=0;
double M_hor=0;
double M_ver=0;
double M_image=0;
//水平块效应估计
for (k=1;k<=nWidth/8-1;k++)
{
for (i=0;i<nHeight;i++)
{
double Local_mean=0;
double Local_mean_left=0;
double Local_mean_right=0;
double Local_activity=0;
double Local_activity_left=0;
double Local_activity_right=0;
double Weight;
//求左右临块的亮度均值
for(n=k*8-8;n<=k*8-1;n++)
{
Local_mean_left+=I[i][n]/8;
}
for(n=k*8;n<=k*8+7;n++)
{
Local_mean_right+=I[i][n]/8;
}
Local_mean=(Local_mean_left+Local_mean_right)/2;
//求左右临块的亮度变化值
for(n=k*8-8;n<=k*8-1;n++)
{
Local_activity_left+=(I[i][n]-Local_mean_left)*(I[i][n]-Local_mean_left)/8;
}
for(n=k*8;n<=k*8+7;n++)
{
Local_activity_right+=(I[i][n]-Local_mean_right)*(I[i][n]-Local_mean_right)/8;
}
Local_activity=(sqrt(Local_activity_left)+sqrt(Local_activity_right))/2;
//求权值系数
if (Local_mean<=81)
{
Weight=1.15201*log(1+(sqrt(Local_mean)/(1+Local_activity)));
}
else
{
Weight=log(1+(sqrt(255-Local_mean)/(1+Local_activity)));
}
Weighted_Value_v = Weight*(I[i][k*8-1]-I[i][k*8]);
Weighted_Value += Weighted_Value_v*Weighted_Value_v;
for(int m =1;m<=7;m++)
{Weighted_Value_interpixel += (Weight*(I[i][k*8+m-1]-I[i][k*8+m]))*(Weight*(I[i][k*8+m-1]-I[i][k*8+m]));}
}
}
M_hor=sqrt(Weighted_Value)/sqrt(Weighted_Value_interpixel)*7;
Weighted_Value=0;
Weighted_Value_interpixel=0;
//图像存储矩阵转置
for (j=0;j<nHeight;j++)
{
for (i=0;i<nWidth;i++)
{
I_trans[i][j]=I[j][i];
}
}
//竖直块效应估计
for (k=1;k<=nHeight/8-1;k++)
{
for (i=0;i<nWidth;i++)
{
double Local_mean=0;
double Local_mean_left=0;
double Local_mean_right=0;
double Local_activity=0;
double Local_activity_left=0;
double Local_activity_right=0;
double Weight=0;
//求左右临块的亮度均值
for(n=k*8-8;n<=k*8-1;n++)
{
Local_mean_left+=I_trans[i][n]/8;
}
for(n=k*8;n<=k*8+7;n++)
{
Local_mean_right+=I_trans[i][n]/8;
}
Local_mean=(Local_mean_left+Local_mean_right)/2;
//求左右临块的亮度变化值
for(n=k*8-8;n<=k*8-1;n++)
{
Local_activity_left+=(I_trans[i][n]-Local_mean_left)*(I_trans[i][n]-Local_mean_left)/8;
}
for(n=k*8;n<=k*8+7;n++)
{
Local_activity_right+=(I_trans[i][n]-Local_mean_right)*(I_trans[i][n]-Local_mean_right)/8;
}
Local_activity=(sqrt(Local_activity_left)+sqrt(Local_activity_right))/2;
//求权值系数
if (Local_mean<=81)
{
Weight=1.15201*log(1+(sqrt(Local_mean)/(1+Local_activity)));
}
else
{
Weight=log(1+(sqrt(255-Local_mean)/(1+Local_activity)));
}
Weighted_Value+=(Weight*(I_trans[i][k*8-1]-I_trans[i][k*8]))*(Weight*(I_trans[i][k*8-1]-I_trans[i][k*8]));
for(int m=1;m<=7;m++)
{Weighted_Value_interpixel+=(Weight*(I_trans[i][k*8+m-1]-I_trans[i][k*8+m]))*(Weight*(I_trans[i][k*8+m-1]-I_trans[i][k*8+m]));}
}
}
M_ver=sqrt(Weighted_Value)/sqrt(Weighted_Value_interpixel)*7;
//图像块效应估计值
M_image=(M_hor+M_ver)/2;
printf("M_H= %f\n",M_hor);
printf("M_V= %f\n",M_ver);
printf("M_IMAGE= %f\n",M_image);
return (M_image);
}