yuv转成matlab可读的rgb格式

xiaoxiao2021-02-27  192

YUV(亦称YCrCb)是被欧洲电视系统所采用的一种颜色编码方法(属于PAL,PAL是指色彩系统,经常被配以625线、每秒25格画面、隔行扫描的电视广播格式)。 YUV主要用于优化彩色视频信号的传输,使其向后兼容老式黑白电视。与RGB视频信号传输相比,它最大的优点在于只需占用极少的带宽(RGB要求三个独立的视频信号同时传输)。其次YUV表示法的重要性是它的亮度信号(Y)和色度信号(U、V)是相互独立的 ,其另一个优点是可以利用人眼的特性来降低数字彩色图像所需要的存储容量。 其中”Y”表示明亮度(Luminance或Luma),也就是灰阶值;是个基带信号。而”U”和”V”表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。U和V不是基带信号,它俩是被正交调制了的。 “亮度”是通过RGB输入信号来创建的,方法是将RGB信号的特定部分叠加到一起。”色度”则定义了颜色的两个方面-色调与饱和度,分别用Cr和Cb来表示。其中,Cr反映了RGB输入信号红色部分与RGB信号亮度值之间的差异。而Cb反映的是RGB输入信号蓝色部分与RGB信号亮度值之同的差异。通过运算,YUV三分量可以还原出R(红),G(绿),B(蓝)。

一、和rgb之间换算公式

yuv<–>rgb

Y’= 0.299*R”+ 0.587*G’ + 0.114*B’

U’= -0.147*R’ - 0.289*G’ + 0.436*B’ = 0.492*(B’- Y’)

V’= 0.615*R’ - 0.515*G’ - 0.100*B’ = 0.877*(R’- Y’)

R’ = Y’ + 1.140*V’

G’ = Y’ - 0.394*U’ - 0.581*V’

B’ = Y’ + 2.032*U’

yCbCr<–>rgb

Y’ = 0.257*R’ + 0.504*G’ + 0.098*B’ + 16

Cr’ = 0.439*R”- 0.368*G’ - 0.071*B’ + 128

Cb’ = -0.148*R’ - 0.291*G’ + 0.439*B’ + 128

R’ = 1.164*(Y’-16) + 1.596*(Cr’-128)

G’ = 1.164*(Y’-16) - 0.813*(Cr’-128) - 0.392*(Cb’-128)

B’ = 1.164*(Y’-16) + 2.017*(Cb’-128)

Note: 上面各个符号都带了一撇,表示该符号在原值基础上进行了伽马校正,伽马校正有助于弥补在抗锯齿的过程中,线性分配伽马值所带来的细节损失,使图像细节更加丰富。在没有采用伽马校正的情况下,暗部细节不容易显现出来,而采用了这一图像增强技术以后,图像的层次更加明晰了。

二、H264的视频格式——H264支持4:2:0的连续或隔行视频的编码和解码 在常见H264测试的YUV序列中,例如CIF图像大小的YUV序列(352*288),在文件开始并没有文件头,直接就是YUV数据,先存第一帧的Y信息,长度为352*288个byte, 然后是第一帧U信息长度是352*288/4个byte, 最后是第一帧的V信息,长度是352*288/4个byte, 因此可以算出第一帧数据总长度是352*288*1.5,即152064个byte, 如果这个序列是300帧的话, 那么序列总长度即为152064*300=44550KB,这也就是为什么常见的300帧CIF序列总是44M的原因.

参照一指流砂博客,链接http://www.cnblogs.com/qinjunni/archive/2012/02/23/2364446.html

以下是用MATLAB将yuv转rgb的代码

close all; clear fid = fopen('akiyo_qcif.yuv','r'); row=176*2;col=144*2;%画面尺寸大小,CIF图像大小的YUV序列(352*288) frames=4; % total=300 Y=zeros(row,col,frames); U=zeros(row/2,col/2,frames); V=zeros(row/2,col/2,frames); UU=zeros(row,col,frames);%隔行扫描时的变量 VV=zeros(row,col,frames); for frame=1:frames [Y(:,:,frame),count] = fread(fid,[row,col],'uchar'); [U(:,:,frame),count1]=fread(fid,[row/2,col/2],'uchar'); [V(:,:,frame),count2]=fread(fid,[row/2,col/2],'uchar'); UU(1:2:row-1,1:2:col-1,frame)=U(:,:,frame);%奇奇 UU(1:2:row-1,2:2:col,frame)=U(:,:,frame);%奇偶 UU(2:2:row,1:2:col-1,frame)=U(:,:,frame);%偶奇 UU(2:2:row,2:2:col,frame)=U(:,:,frame);%偶偶 VV(1:2:row-1,1:2:col-1,frame)=V(:,:,frame); VV(1:2:row-1,2:2:col,frame)=V(:,:,frame); VV(2:2:row,1:2:col-1,frame)=V(:,:,frame); VV(2:2:row,2:2:col,frame)=V(:,:,frame); R = Y + 1.140 * (VV-128 ); G = Y + 0.395 * (UU-128 ) - 0.581 *(VV-128); B = Y + 2.032 *(UU-128); for i=1:row %针对0到255 for j=1:col if R(i,j,frame)<0 R(i,j,frame)=0; end if R(i,j,frame)>255 R(i,j,frame)=255; end if G(i,j,frame)<0 G(i,j,frame)=0; end if G(i,j,frame)>255 G(i,j,frame)=255; end if B(i,j,frame)<0 B(i,j,frame)=0; end if B(i,j,frame)>255 B(i,j,frame)=255; end end end R=R/255;G=G/255;B=B/255; images(:,:,1)=R(:,:,frame)'; images(:,:,2)=G(:,:,frame)'; images(:,:,3)=B(:,:,frame)'; figure,imshow(images) imwrite(images,['F:\',num2str(frame), '.jpg']) end
转载请注明原文地址: https://www.6miu.com/read-11435.html

最新回复(0)