图像处理之RGB转YCbCr算法实现"/>
FPGA图像处理之RGB转YCbCr算法实现
1. RGB模型介绍
所谓RGB模型,是认为人眼里有三种感光细胞,分别对应红色、绿色和蓝色最敏感。人眼之所以看到各种颜色的光,主要是这三种感光细胞感觉综合的结果,而红、绿、蓝被称为三原色。
2. YCbCr色域介绍
YCbCr在世界数字组织视频标准研制过程中,称为ITU - R BT.601 建议的一部分,其实是YUV经过缩放和偏移的翻版。YCbCr由Y(Luminance)、Cb(Chrominance-Blue)和Cr(Chrominance-Red)组成,其中Y表示颜色的明亮度和浓度,Cb和Cr则分别表示颜色的蓝色浓度偏移量和红色浓度偏移量。
YCbCr格式是一种数字信号,可以细分为两种格式: tv range格式与full range格式,主要区别如下。
1)tv range 格式
Y∈[16,235],Cb∈[16,240],Cr∈[16,240],主要是广播电视采用的数字标准。
2)full range 格式
Y、Cb、Cr∈[0,255],主要是PC端采用的标准,所以也称为pc range格式。
3. RGB与YCbCr转换公式
(1)对标准SDTV(标准清晰度电视),采用ITU - RBT.601数据格式,其中YCbCr为tv range格式,RGB与YCbCr的相互转换公式如下:
(2)(
(2)对full range 或者pc range 的YCbCr格式
FPGA 硬件实现推导
原始公式如下:
首先去掉浮点,把数值扩大256倍,公式如下(舍去小数点,不能四舍五入):
再对上述结果右移8位,相当于除了256
同上,推导Cb/Cr的计算公式如下:
FPGA代码实现
module RGB888_YCbCr444(input clk,input rst_n,//Image data prepred to be processedinput pre_img_vsync, //Prepared Image data vsync valid signalinput pre_img_href, //Prepared Image data href valid signalinput [7:0] per_img_red, //Prepared Image red data to be processedinput [7:0] per_img_green, //Prepared Image green data to be processedinput [7:0] per_img_blue, //Prepared Image blue data to be processed//Image data has been processedoutput post_img_vsync, //Processed Image data vsync valid signaloutput post_img_href, //Processed Image data href valid signaloutput [7:0] post_img_Y, //Processed Image brightness outputoutput [7:0] post_img_Cb, //Processed Image blue shading outputoutput [7:0] post_img_Cr, //Processed Image red shading output);reg [15:0] img_red_r0,img_red_r1,img_red_r2;reg [15:0] img_green_r0,img_green_r1,img_green_r2;reg [15:0] img_blue_r0,img_blue_r1,img_blue_r2;always@(posedge clk)beginimg_red_r0 <= per_img_red * 8'd76;img_red_r1 <= per_img_red * 8'd43;img_red_r2 <= per_img_red * 8'd128;img_green_r0 <= per_img_green * 8'd150;img_green_r1 <= per_img_green * 8'd84;img_green_r2 <= per_img_green * 8'd107;img_blue_r0 <= per_img_blue * 8'd29;img_blue_r1 <= per_img_blue * 8'd128;img_blue_r2 <= per_img_blue * 8'd20;endreg [15:0] img_Y_r0;reg [15:0] img_Cb_r0;reg [15:0] img_Cr_r0;always@(posedge clk)beginimg_Y_r0 <= img_red_r0 + img_green_r0 + img_blue_r0;img_Cb_r0 <= img_blue_r1 - img_red_r1 - img_green_r1 + 16'd32768;img_Cr_r0 <= img_red_r2 - img_green_r2 - img_blue_r2 + 16'd32768;endreg [7:0] img_Y_r1;reg [7:0] img_Cb_r1;reg [7:0] img_Cr_r1;always@(posedge clk)beginimg_Y_r1 <= img_Y_r0[15:8];img_Cb_r1 <= img_Cb_r1[15:8];img_Cr_r1 <= img_Cr_r1[15:8];endreg [2:0] per_img_vsync_r;reg [2:0] per_img_href_r;always@(posedge clk)beginif(!rst_n)beginper_img_vsync_r <= 0;per_img_href_r <= 0;endelse beginper_img_vsync_r <= {per_img_vsync_r[1:0],per_img_vsync};per_img_href_r <= {per_img_href_r[1:0],pre_img_href};endendassign post_img_vsync = per_img_vsync_r[2];assign post_img_href = per_img_href_r[2];assign post_img_Y = post_img_href ? img_Y_r1 : 8'd0;assign post_img_Cb = post_img_href ? img_Cb_r1 : 8'd0;assign post_img_Cr = post_img_href ? img_Cr_r1 : 8'd0;endmodule
参考资料:基于MATLAB 与FPGA的图像处理教程 (韩彬)
更多推荐
FPGA图像处理之RGB转YCbCr算法实现
发布评论