基于FPGA的RGB565_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、右移操作

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值