音视频数据处理入门:yuv灰阶测试与PSNR评估

1、生成YUV420p格式的灰阶测试图

灰阶代表了由最暗到最亮之间不同亮度的层次级。这中间层级越多,所能够呈现的画面效果也就越细腻。

// 生成灰阶测试图, barnum指有多少个亮度层次
void yuv420_graybar(int w, int h, int ymin, int ymax, int barnum) {
    FILE *fout = fopen("output_graybar.yuv", "w+");
    
    unsigned char data_y[w*h];
    unsigned char data_u[w*h/4];
    unsigned char data_v[w*h/4];

    unsigned char lums[barnum];		//亮度
    float lum_inc = (float)(ymax - ymin) / (barnum - 1);
    for (int i = 0; i < barnum; i++) {
        lums[i] = ymin + (unsigned char)(i * lum_inc);
    }
    
    unsigned char level[w];
    int barwidth = w / barnum;     
    for (int i = 0; i < barnum; i++) {
        memset(level + i*barwidth, lums[i], barwidth);
    }
   // draw picture
    for (int i = 0; i < h; i++) {
        memcpy(data_y + i*w, level, w);
    }
    memset(data_u, 128, w*h/4);
    memset(data_v, 128, w*h/4);
   
    fwrite(data_y, w*h, 1, fout);
    fwrite(data_u, w*h/4, 1, fout);
    fwrite(data_v, w*h/4, 1, fout);
    
    fclose(fout);
}

函数调用:yuv420_graybar(320, 240, 0, 255, 10);
image-20210425110117293


2、评估图像受损程度

PSNR是最基本的视频质量评价方法。通过计算受损图像和原始图像之间的差别,评价受损图像的质量。PSNR取值通常情况下都在20-50的范围内,取值越高,代表两张图像越接近,图像受损程度低。
① M S E = 1 w ∗ h ∑ i = 1 w ∑ j = 1 h ( x i j − y i j ) 2 ①MSE = \frac{1}{w*h}\sum_{i=1}^w\sum_{j=1}^h(x_{ij} - y_{ij})^2 MSE=wh1i=1wj=1h(xijyij)2 ② P S N R = 10 ∗ l o g 10 ( 25 5 2 M S E ) ②PSNR = 10*log_{10}(\frac{255^2}{MSE}) PSNR=10log10(MSE2552)

注:w、h分别是图像的宽高,xij和yij分别是两张图像的每一个像素值。


①先获得一张受损图像(修改Y分量):

image-20210425115528159

②对比两张图像的Y分量

void yuv420_psnr(char *origin, char *target, int w, int h, int num) {
    FILE *fp = fopen(origin, "r");
    FILE *ft = fopen(target, "r");

    unsigned char buf1[w*h]; 
    unsigned char buf2[w*h]; 
    float psnr = 0.0;
    for (int i = 0; i < num; i++) {
        fread(buf1, 1, w*h, fp);
        fread(buf2, 1, w*h, ft);

        int sum = 0;
        for (int i = 0; i < h; i++) {
            for (int j = 0; j < w; j++) {
                int t = i*w + j;
                sum += pow((buf1[t] - buf2[t]),2);
            }
        }
        float MSE = (float)sum / (float)(w*h);
        
        psnr = 10*log10(255*255/MSE);
        printf("psnr: %f\n", psnr);

        fseek(fp, w*h/2, SEEK_CUR);
        fseek(ft, w*h/2, SEEK_CUR);
    } 

    fclose(fp);
    fclose(ft);
}

函数调用:yuv420_psnr("origin.yuv", "target.yuv", 640, 272, 1);

编译链接:gcc yuv420_psnr.c -lm
image-20210425115901981

运行结果:psnr: 23.300215

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值