#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 720
#define Y_HEIGHT 576
#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;
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);
ReadImage(Y_space2,"G:\cif_data\\test_rec16.yuv",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;
return (M_image);
}
yuv.rar_GBIM_jpeg encoder_yuv jpeg
版权申诉
170 浏览量
2022-09-22
17:55:09
上传
评论
收藏 15KB RAR 举报
御道御小黑
- 粉丝: 62
- 资源: 1万+
最新资源
- 基于thinkphp5/weui/layui的简易投票系统,适用于社团/班级投票选举
- 基于Spring +mybatis的投票系统 支持单选多选,统计信息等
- 基于pandas、Scikit-Learn、matplotlib、PyQt5的二手房价分析与预测系统
- 基于 yolov5 和 PyQt5 开发工具搭建了实时违法检测区域入侵软件,支持自定义检测区域、多种对象检测以及事件信息统计
- ZG202220101014胡雪梅.zip
- 姥娘家菜单修改最新再做500张.cdr
- 基于Python实现的英雄联盟知识图谱的问答
- 密码学算法之SHA-1
- 基于Python实现联邦学习框架下基于Memae的异常检测架构
- 密码学之DES加密算法
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈