FPGA图像处理入门 ZYNQ7020 rgb2ycbcr


前言

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可以验证处理结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值