m基于FPGA的RGB转ycrcb颜色空间转换算法实现,包含testbench,对比三种转换方法

目录

 

1.算法仿真效果

2.算法涉及理论知识概要

3.Verilog核心程序

4.完整算法代码文件


1.算法仿真效果

vivado2019.2仿真结果如下:

其中1为直接乘法公式计算;

2为移位法计算;

3为分布式计算;

2.算法涉及理论知识概要

        人类获得信息的主要方式是视觉,通常情况下颜色有2种描述方式,一种是RGB色度空间表示,一种是 YCbCr色度空间表示。然而,普通的R GB颜色空间对视频的显示存在很多问题,将其转换为YCbCr颜色空间能够很 好地适应现代社会的要求,本文正是采用一种新的方法,通过FPGA成功地将其转化,并得到正确的结果,此方法内 部变量少、算法优点突出、实时性好,十分易于在实际工程中实现。

     RGB颜色空间
        在RGB颜色空间中,1个带颜色的图像采样是用3个 值来表示一个像素点的相对的红、绿和蓝色比(3种光线的 主样构成颜色)。任何颜色都可以通过把红、绿和蓝通过 不同的比例相混得到。CRT和LCD通过分别对每个像素 点的红绿蓝值进行显示来得到各种颜色。从一个通常的观
察距离来看,不同的构成部分可以达到颜色上的真实感。

        YCbCr颜色空间
       人类视觉系统(HVS)相比亮度来说对于颜色不是那 么敏感。在RGB颜色空间中,3种颜色被平等地看待,并 用相同的分辨率存放起来。但是通过把亮度与颜色信息 分离,并对亮度值取更高的分辨率可以更有效地表示1个 颜色图像。

       颜色空间转换
        YCbCr颜色空间和它的变换(通常写为YUV)是1种 流行而高效的表示一个颜色图像的方法。YCrCb是国际 通用的B T.601数字电视信号中使用的彩色空间,它由 YU V彩色空间经过缩放和平移得到。YCrCb色度空间与 R GB色度空间的转换公式如下:

量化后的公式:

建设输入的信号为10位,那么我假设二进制数10_0000_0000代表十进制的1,那么上面的式子分别为:

0.299/1=x/(10_0000_0000)2,那么x=306(十进制)

所以上面的系数可以变为整数。那么转化公式为:

 

直接乘法公式计算

       直接相乘,我们直接调用系统的IP核,如果版本不同,需要重新生成。如代码段中:

移位法计算

    位移法就是用位移的方法来替换乘法器。

根据二进制乘法过程。二进制的乘法可以理解为,移位相加。

具体代码如上所示:

例如R*0010001100,那么其第三,四,八为1,所以结果为R移位7,R移位3,R移位2,最后三个相加得到。

分布式计算

    分布式算法是一种快速的流水线结构的算法,根据你提供的论文的要求,这个分布式算法的具体物理结构如下所示:

 将输入信号的每一位和另一个数相乘,通过10级流水线操作后,我们可以得到10个部分积,然后将10个部分积累加,得到最后的结果。 

3.Verilog核心程序

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2023/03/26 18:01:20
// Design Name: 
// Module Name: tops
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module tops(
                clk, 
					  ena, 
					  r, 
					  g, 
					  b, 
					  y, 
					  cr, 
					  cb
					  );

input     clk;//输入时钟
input     ena;//输入使能信号
input[7:0]r;  //输入R,G,B信号
input[7:0]g;
input[7:0]b;

output[7:0]y;//输出Y,CR,CB信号
output[7:0]cr;
output[7:0]cb;

//mult your_instance_name (
//  .CLK(CLK),    // input wire CLK
//  .A(A),        // input wire [9 : 0] A
//  .B(B),        // input wire [9 : 0] B
//  .SCLR(SCLR),  // input wire SCLR
//  .P(P)        // output wire [19 : 0] P
//);
//================================================
wire[21:0]y1;
wire[21:0]cr1;
wire[21:0]cb1;
//================================================
wire[19:0]yr; 
wire[19:0]yg; 
wire[19:0]yb; 

mult mult_yr(
				.CLK  (clk), 
				.A    (10'd306), 
				.B    ({r,2'b00}), 
				.SCLR (ena), 
				.P    (yr)
            );


mult mult_yg(
				.CLK  (clk), 
				.A    (10'd601), 
				.B    ({g,2'b00}), 
                .SCLR (ena), 
				.P    (yg)
            );
				
mult mult_yb(
				.CLK  (clk), 
				.A    (10'd116), 
				.B    ({b,2'b00}), 
                .SCLR (ena), 
				.P    (yb)
            );
		
assign y1  = yr + yg + yb;
assign y   = y1[21:14];//y计算公式



wire[19:0]crr;
wire[19:0]crg; 
wire[19:0]crb;

mult mult_crr(
				.CLK  (clk), 
				.A    (10'd512), 
				.B    ({r,2'b00}),
                .SCLR (ena), 
				.P    (crr)
            );

mult mult_crg(
				.CLK  (clk), 
				.A    (10'd429), 
				.B    ({g,2'b00}), 
				.SCLR (ena), 
				.P    (crg)
            );
				
mult mult_crb(
				.CLK  (clk), 
				.A    (10'd83), 
				.B    ({b,2'b00}), 
				.SCLR (ena), 
				.P    (crb)
            );

assign cr1 = crr - crg - crb;
assign cr  = cr1[21:14]+128;//cr计算公式


wire[19:0]cbr; 
wire[19:0]cbg; 
wire[19:0]cbb;

mult mult_cbr(
				.CLK  (clk), 
				.A    (10'd173), 
				.B    ({r,2'b00}), 
				.SCLR (ena), 
				.P    (cbr)
            );

mult mult_cbg(
				.CLK  (clk), 
				.A    (10'd339), 
				.B    ({g,2'b00}), 
				.SCLR (ena), 
				.P    (cbg)
            );
				
mult mult_cbb(
				.CLK  (clk), 
				.A    (10'd512), 
				.B    ({b,2'b00}), 
				.SCLR (ena), 
				.P    (cbb)
            );

assign cb1 = cbb - cbr - cbg;
assign cb  = cb1[21:14]+128;//cb计算公式
endmodule
09_045_m

4.完整算法代码文件

V

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
非常感谢您的提问,这是一道非常有挑战性的问题。我将尽力回答您的问题,但由于篇幅限制,我无法在此提供完整的代码实现。 首先,我需要说明的是,RGBYCbCr和YUV是三种不同的颜色空间,它们之间的转换涉及到一些复杂的算法。在这里,我将仅提供RGBYCbCrRGB到YUV的转换方法,而不涉及从YCbCr或YUV到RGB转换RGBYCbCr转换: 1. 对于每个像素,将RGB转换为浮点数。 2. 将浮点数的值乘以转换矩阵,得到YCbCr值。转换矩阵如下: Y = 0.299R + 0.587G + 0.114B Cb = -0.1687R - 0.3313G + 0.5B + 128 Cr = 0.5R - 0.4187G - 0.0813B + 128 3. 将Y、Cb和Cr值限制在0到255之间,然后转换为整数。 RGB到YUV转换: 1. 对于每个像素,将RGB转换为浮点数。 2. 将浮点数的值乘以转换矩阵,得到YUV值。转换矩阵如下: Y = 0.299R + 0.587G + 0.114B U = -0.14713R - 0.28886G + 0.436B + 128 V = 0.615R - 0.51498G - 0.10001B + 128 3. 将Y、U和V值限制在0到255之间,然后转换为整数。 为了验证转换的正确性,您可以选择一些RGB图像,将它们转换YCbCr或YUV格式,然后将它们与标准的转换结果进行比较。您也可以使用一些软件工具来完成此任务,例如Matlab或OpenCV。 最后,我想提醒您的是,实现这个转换算法需要一定的硬件资源和编程技能,因此您需要具备一定的Verilog编程经验才能完成这个任务。同时,您还需要使用一些仿真工具来验证您的代码实现

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我爱C编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值