YUV2与RGB图像变换

本文介绍了一个使用C和C++进行色彩空间转换的实验,详细讲解了YUV到RGB的转换原理,包括YUV与RGB的相互转换公式、8比特量化处理和4:2:0色度格式。实验代码展示了如何从YUV图像中提取数据并计算RGB值,同时指出由于4:2:0格式和边界处理,转换过程中可能会导致颜色丢失。实验结果显示,RGB图像相比YUV会有颜色减少的现象。
摘要由CSDN通过智能技术生成

实验目标

使用c以及c++语言编写色彩空间的转换,利用YUV文件转换为RGB文件并比较不同。

实验原理

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.在对分量信号进行8比特均匀量化时,共分为256个等间隔的量化级。为了防止信号变动造成过载,在256级上端留20级,下端留16级作为信号超越动态范围的保护带。色差信号经过归一化处理后,动态范围为-0.5-0.5,让色差零电平对应码电平128,色差信号总共占225个量化级。在256级上端留15级,下端留16级作为信号超越动态范围
的保护带。
3.色度格式
4:2:0格式是指色差信号U,V的取样频率为亮度信号取样频率的四分之一,在水平方向和垂直方向上的取样点数均为Y的一半。
在这里插入图片描述

实验代码

主代码

#include <stdio.h>
#include <stdlib.h>
#include "yuv2rgb.h"

int main(int argc, const char * argv[])
{
   
    FILE *yuv = NULL;
    FILE *rgb = NULL;//建立文件
    fopen_s(&yuv, "D://down.yuv_out", "rb");
    fopen_s(&rgb, "D://down.rgb", "wb");//打开文件
    unsigned long Height=256, Width=256;
    int buf_yuv = Height*Width+Height*Width/4+Height*Width/4;;//使用一个一维buffer存储yuv文件
    unsigned char *bufferyuv;
    int *buf_r, *buf_g, *buf_b;
    bufferyuv = (unsigned char *)malloc(buf_yuv);
    buf_r = (int *)malloc(sizeof(int)* Height*Width);
    buf_b = (int *)malloc(sizeof(int)* Height*Width);
    buf_g = (int *)malloc(sizeof(int)* Height*Width);
    fread(bufferyuv, 1, buf_yuv, yuv);//读入数据
    yuv2rgb(Height,Width,buffer
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值