数据压缩原理 实验报告一 彩色空间转换

实验原理

YUV与RGB转换公式

由电视原理可知,RGB信号转换为YUV信号的公式为

Y=  0.2990R + 0.5870G + 0.1140B
U= -0.1684R - 0.3316G + 0.5B
V=     0.5R - 0.4187G - 0.0813B

YUV信号转换为RGB信号的公式为

R= Y + 1.4075(V−128)
G= Y − 0.3455(U−128) − 0.7169(V−128)
B= Y + 1.779 (U−128 

YUV与RGB存储方式

YUV存储方式是将一帧图像的Y、U、V数据分开来存,先存所有的Y数据,再存所有的U数据,再存所有的V数据。

RGB存储方式是将一帧图像按像素点存储,先存第一个像素点的B、G、R数据,再存第二个点的B、G、R数据。

YUV与RGB所需存储空间

当YUV色度格式为4:4:4时,每一个像素点有一个Y一个U一个V,所需存储空间为height*width*3;

当YUV色度格式为4:2:0时,每一个像素点有一个Y,四个像素点共用一个U一个V,所需存储空间为height*width*1.5;

RGB格式每一个像素点有一个R一个G一个B,所需存储空间为height*width*3。

实验流程

打开RGB文件,先将RGB信号转换为4:4:4色度格式的YUV信号,再将4:4:4色度格式的YUV信号转换为4:2:0色度格式的YUV信号,最后写入YUV文件。

代码分析

yuv2rgb.h代码

#ifndef YUV2RGB_H_
#define YUV2RGB_H_

int YUV2RGB (int x_dim, int y_dim, void *bmp, void *y_out, void *u_out, void *v_out, int flip);

void InitLookupTable();

#endif

yuv2rgb.cpp代码

/*
    总步骤:先将4:2:0格式的YUV转成4:4:4格式的YUV 再把YUV转成RGB
*/

#include "stdlib.h"
#include "yuv2rgb.h"

static float YUVRGB14075[256], YUVRGB03455[256], YUVRGB07169[256], YUVRGB17790[256];

/*
    R=Y+1.4075(V−128)
    G=Y−0.3455(U−128)−0.7169(V−128)
    B=Y+1.779(U−128)
    定义静态全局变量,计算所有可能出现的值
 */

int YUV2RGB (int x_dim, int y_dim, void *rgb_out, void *y_in, void *u_in, void *v_in, int flip)
{
    static int init_done = 0;

    long i, j, size;
    unsigned char *r, *g, *b;                                   //建RGB指针
    unsigned char *y, *u, *v;                                   //建YUV指针
    float rr, gg, bb;                                           //因为RGB可能会溢出 所以建立RGB中转变量
    unsigned char *pu, *pv, *psu1, *psu2, *psv1, *psv2;         //建把YUV转成4:4:4格式的指针
    unsigned char *y_buffer, *u_buffer, *v_buffer, *rgb_buffer;
    unsigned char *sub_u_buf, *sub_v_buf;

    if (init_done == 0)
    {
        InitLookupTable();
        init_done = 1;
    }

    // check to see if x_dim and y_dim are divisible by 2
    if ((x_dim % 2) || (y_dim % 2)) return
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值