彩色空间转换的基本思想及转换公式
(1)YUV与RGB空间的相互转换
由电视原理可知,亮度和色差信号的构成如下:
Y=0.2990R+0.5870G+0.1140B
R-Y=0.7010R-0.5870G-0.1140B
B-Y=-0.2990R-0.5870G+0.8860B
为了使色差信号的动态范围控制在0.5之间,需要进行归一化,对色差信号引入压缩
系数。归一化后的色差信号为:
U=-0.1684R-0.3316G+0.5B
V=0.5R-0.4187G-0.0813B
(2) 码电平分配及数字表达式
a亮电平信号量化后码电平分配
在对分量信号进行8比特均匀量化时,共分为256个等间隔的量化级。为了防止信号
变动造成过载,在256级上端留20级,下端留16级作为信号超越动态范围的保护带。
b色差信号量化后码电平分配
色差信号经过归一化处理后,动态范围为-0.5-0.5,让色差零电平对应码电平128,
色差信号总共占225个量化级。在256级上端留15级,下端留16级作为信号超越动态范围
的保护带。
(3)色度格式
4:2:0格式是指色差信号U,V的取样频率为亮度信号取样频率的四分之一,在水平方
向和垂直方向上的取样点数均为Y的一半。
rgb2yuv main
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include "rgb2yuv.h"
#include "stdafx.h"
#include<iostream>
using namespace std;
#define u_int8_t unsigned __int8
#define u_int unsigned __int32
#define u_int32_t unsigned __int32
#define FALSE false
#define TRUE true
int main(int argc, char* argv[])
{
int frameWidth = 256;
int frameHeight = 256;
bool flip = TRUE;
unsigned int i;
//文件指针
FILE* rgbFile = NULL;
FILE* yuvFile = NULL;
char* rgbFileName = NULL;
char* yuvFileName = NULL;
//内存指针
u_int8_t* rgbBuf = NULL;
u_int8_t* yBuf = NULL;
u_int8_t* uBuf = NULL;
u_int8_t* vBuf = NULL;
rgbFileName = argv[1