前言
rgb转灰度是基本的图像处理操作
一、转换公式
// Y = (77 *R + 150*G + 29 *B)>>8
// Cb = (-43*R - 85 *G + 128*B)>>8 + 128
// Cr = (128*R - 107*G - 21 *B)>>8 + 128
//--->
// Y = (77 *R + 150*G + 29 *B)>>8
// Cb = (-43*R - 85 *G + 128*B + 32768)>>8
// Cr = (128*R - 107*G - 21 *B + 32768)>>8
二、rgb2ycbcr模块实现
接口信号
module rgb2ycbcr (
input clk ,
input rst_n ,
input i_vs ,
input i_de ,
input [7:0] i_r ,
input [7:0] i_g ,
input [7:0] i_b ,
output reg o_vs ,
output reg o_de ,
output reg [7:0] o_y ,
output reg [7:0] o_cb ,
output reg [7:0] o_cr
);
根据公式 同时对rgb做乘法 然后移位 最后加法 共消耗三个周期
部分代码:
always@(posedge clk)
if(!rst_n)
begin
i_b0 <= 'd0;
i_b1 <= 'd0;
i_b2 <= 'd0;
end
else
begin
i_b0 <= i_b * 29 ;
i_b1 <= i_b * 128 ;
i_b2 <= i_b * 21 ;
end
always@(posedge clk)
if(!rst_n)
begin
o_y0 <= 0;
o_cb0 <= 0;
o_cr0 <= 0;
end
else
begin
o_y0 <= i_r0 + i_g0 + i_b0 ;
o_cb0 <= -i_r1 - i_g1 + i_b1 + 32768 ;
o_cr0 <= i_r2 - i_g2 - i_b2 + 32768 ;
end
同步信号打拍三个周期 完成同步
always@(posedge clk)
if(!rst_n)
begin
i_vs_d0 <= 'd0;
i_de_d0 <= 'd0;
i_vs_d1 <= 'd0;
i_de_d1 <= 'd0;
end
else
begin
i_vs_d0 <= i_vs ;
i_de_d0 <= i_de ;
i_vs_d1 <= i_vs_d0 ;
i_de_d1 <= i_de_d0 ;
end
always@(posedge clk)
if(!rst_n)
begin
o_vs <= 'd0;
o_de <= 'd0;
end
else
begin
o_vs <= i_vs_d1 ;
o_de <= i_de_d1 ;
end
三、仿真
可以看到处理后的数据延后三个周期 实时处理
左侧为matlab处理 右侧为fpga处理 可以看到fpga实现了rgb转灰度的操作
总结
利用matlab可以验证处理结果