一文知道fpga如何实现YCbCr422转YCbCr444

描述

1 YCbCr颜色空间

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

1.1 44 YCbCr格式

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

FPGA

图1 44采样

1.2 42 YCbCr格式

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

FPGA

图2 42协调位置采样

2 matlab YCbCr422转YCbCr444

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

close all

clear all

clc

I=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;

end

end

for i=1:1:H

for j=2:2:W

Cr1(i,j/2)=(Cr0(i,j-1)+Cr0(i,j))/2;

end

end

for 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

end

end

%由YCbCr422转出YCbCr444

%Cb

for 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

end

end

%Cr

for 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

end

end

CbCr=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;

end

always@(posedge clk or negedge rst_n)

begin

if(~rst_n)

flag <= 1'b0;

else if(de_o==1'b1)

flag <= ~flag;

else

flag <= 1'b0;

end

//将CbCr分开,并复制

//如:CbYCrYCbYCrY --> CbCrYCbCrYCbCrYCbCrY

endmodule

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

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分