首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >fpga实现YCbCr422转YCbCr444

fpga实现YCbCr422转YCbCr444

作者头像
FPGA开源工作室
发布2020-09-14 16:50:52
1.1K0
发布2020-09-14 16:50:52
举报
文章被收录于专栏:FPGA开源工作室FPGA开源工作室

1 YCbCr颜色空间

YCbCr颜色空间是YUV颜色空间的缩放和偏移版本。Y定义为8bit,标称颜色范围为16-235;Cb和Cr标称颜色表示范围为16-240。YCbCr的采样格式一般有4:4:4、4:2:2、4:1:1、和4:2:0。

1.1 4:4:4 YCbCr格式

图1表示4:4:4格式YCbCr采样点的定位。每个采样点有Y、Cb和Cr值,每个颜色值的颜色分量为8bit(典型),因此每个采样点24bit。

图1 4:4:4采样

1.2 4:2:2 YCbCr格式

图 2表示4:2:2格式YCbCr采样点定位。对于每两个水平Y采样点,有一个Cb和一个Cr采样点。

图2 4:2:2协调位置采样

2 matlab YCbCr422转YCbCr444

在上一期的基础上将YCbCr422再转回YCbCr444

close allclear allclcI=imread('1.bmp');[H ,W ,D]=size(I);R=double(I(:,:,1));G=double(I(:,:,2));B=double(I(:,:,3));Y0= double(zeros(H,W));Cb0 =double(zeros(H,W));Cr0 = double(zeros(H,W));Cb1 =double(zeros(H,W/2));Cr1 = double(zeros(H,W/2));CbCr = double(zeros(H,W));Cb =double(zeros(H,W));Cr = double(zeros(H,W));%RGB转YCbCr444 for i = 1:H     for j = 1:W         Y0(i, j) = 0.299*R(i, j) + 0.587*G(i, j) + 0.114*B(i, j);         Cb0(i, j) = -0.172*R(i, j) - 0.339*G(i, j) + 0.511*B(i, j) + 128;         Cr0(i, j) = 0.511*R(i, j) - 0.428*G(i, j) - 0.083*B(i, j) + 128;     end end for i=1:1:H    for j=2:2:W        Cb1(i,j/2)=(Cb0(i,j-1)+Cb0(i,j))/2;    endendfor i=1:1:H    for j=2:2:W        Cr1(i,j/2)=(Cr0(i,j-1)+Cr0(i,j))/2;    endendfor i=1:1:H    for j=1:1:W        if rem(j,2)==0         CbCr(i,j)=Cr1(i,j/2);           else         CbCr(i,j)=Cb1(i,(j+1)/2);         end    endend%由YCbCr422转出YCbCr444%Cbfor i=1:1:H    for j=1:1:W        if rem(j,2)==0         Cb(i,j)=Cb1(i,j/2);           else         Cb(i,j)=Cb1(i,(j+1)/2);         end    endend%Crfor i=1:1:H    for j=1:1:W        if rem(j,2)==0         Cr(i,j)=Cr1(i,j/2);           else         Cr(i,j)=Cr1(i,(j+1)/2);         end    endendCbCr=uint8(CbCr);YCbCr(:,:,1)=Y0;YCbCr(:,:,2)=Cb;YCbCr(:,:,3)=Cr;YCbCr=uint8(YCbCr);Y=uint8(Y0);Cb=uint8(Cb);Cr=uint8(Cr);%YCbCr422中的CbCr交替figure(1),imshow(CbCr),title('CbCr');figure(2),subplot(221),imshow(Cb),title('Cb');subplot(222),imshow(Cr),title('Cr');subplot(223),imshow(Y),title('Y');subplot(224),imshow(YCbCr),title('YCbCr');figure(3),imshow(YCbCr),title('YCbCr');

CbCr细节放大为一幅CbCr交错的图像。

YCbCr444的Y分量为一幅灰度图像。

上图为YCbCr422转换后的YCbCr444

3 fpga仿真实现

module YUV422_2YUV444(	input clk,//系统时钟	input rst_n,	input[7:0] y_i,//输入视频亮度信号y	input[7:0] cbcr_i,//输入视频色度信号cbcr	input de_i,//输入视频有效	input hs_i,//输入视频行同步	input vs_i,//输入视频场同步	output [7:0] y_o,//输出视频亮度分量y	output[7:0] cb_o,//输出视频Cb分量	output[7:0] cr_o,//输出视频Cr分量	output reg de_o,//输出视频有效	output reg hs_o,//输出视频行同步	output reg  vs_o//输出视频场同步);reg flag;//CbCr分离时标记信号reg[7:0] cbcr_r,cbcr_r1,y_r;assign cb_o = (flag==1'b0)?cbcr_r:cbcr_r1;assign cr_o = (flag==1'b0)?cbcr_i:cbcr_r;assign y_o = y_r;always@(posedge clk)begin	de_o <= de_i;	hs_o <= hs_i;	vs_o <= vs_i;	cbcr_r<=cbcr_i;	cbcr_r1<=cbcr_r;	y_r<=y_i;endalways@(posedge clk or  negedge rst_n)beginif(~rst_n) flag <= 1'b0;else if(de_o==1'b1) flag <= ~flag;else flag <= 1'b0;end//将CbCr分开,并复制//如:CbYCrYCbYCrY  --> CbCrYCbCrYCbCrYCbCrYendmodule

fpga实现YCbCr422转YCbCr444,效果和matlab一致。


本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-09-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FPGA开源工作室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档