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。
图1 44采样
1.2 42 YCbCr格式
图 2表示42格式YCbCr采样点定位。对于每两个水平Y采样点,有一个Cb和一个Cr采样点。
图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一致。
全部0条评论
快来发表一下你的评论吧 !