基于FPGA的RGB56_YCbCr_Gray的实现

原文链接:http://www.cnblogs.com/ninghechuan/p/7403725.html
将彩色图像转换成灰度图像有两种方式:
一、 令RGB三个分量的数值相等,输出后就可得到灰度图像。二、转化为YCbCr格式,将Y分量提取出来。YCbCr格式中的Y分量表示的是图像的亮度和浓度,所以只输出Y分量,得到的图像即为灰度图像。
因为所配置的摄像头采集数据是RGB565格式,所以将其先转化为RGB888格式。(官方给的转换公式是RGB888-> YCbCr)
16 bit 的RGB565
{R4,R3,R2,R1,R0} -> {R4,R3,R2,R1,R0,R2,R1,R0} 或者{R4,R3,R2,R1,R0,3’b000};
{G5,G4,G3,G2,G1,G0} ->{G5,G4,G3,G2,G1,G0,G1,G0} 或者{G5,G4,G3,G2,G1,G0,2’b00};
{B4,B3,B2,B1,B0} -> {B4,B3,B2,B1,B0,B2,B1,B0} 或者{B4,B3,B2,B1,B0,3’b000};

wire            [4:0]      red ;
wire            [5:0]      green;
wire            [4:0]      blue ;
wire            [7:0]       CMOS_R0;
wire            [7:0]       CMOS_G0;
wire            [7:0]       CMOS_B0;
assign     CMOS_R0 =  {red ,red [2:0]}       ;
assign     CMOS_G0 =  {green,green[1:0]} ;
assign     CMOS_B0 =  {blue ,blue [2:0]}    ;

RGB565转RGB888公式如下:
Y = 0.299R + 0.587G + 0.114B;
Cb = 0.568(B-Y) + 128 = -0.172R-0.339G + 0.511B + 128 ;
Cr = 0.713(R-Y) + 128 = 0.511R - 0.428G - 0.083B + 128 ;

因为FPGA无法直接进行浮点数计算,所以将整个系数扩大256倍,之后再进行右移8位就可以得到相应的值。
Y = ((77R + 150G + 29B)>>8);
Cb = ((-43
R - 85G + 128B)>>8)+128;
Cr = ((128R - 107G - 21*B)>>8)+128;
如果直接按照公式写,会造成关键路径延时过大,整个时钟跑不起来,所以采用流水线,此处流水线3级:(只计算输出Y),流水线虽然消耗了三个时钟,但是整体计算速度却快了3倍左右,可以通过时序报告看出,非常明显。
1、 第一个时钟进行括号中的乘
2、第二个时钟进行求和
3、右移操作

猜你喜欢

转载自blog.csdn.net/emperor_strange/article/details/85004265
今日推荐