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

110 阅读4分钟

1.算法仿真效果

vivado2019.2仿真结果如下:

f6d26621dfff52e0fe0b444a778e5c9f_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

其中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色度空间的转换公式如下:

63987c8d06c1df99b3b83c2175e65691_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png  

直接乘法公式计算

 

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

ac727f0b006a62114a2f9e7943b308aa_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

移位法计算

 

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

 

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

 

541d37e45025aa479201a7301ac2d21e_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

 

具体代码如上所示:

 

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

f8499100ba64c1dbfa59a508169516f0_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

分布式计算

 

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

 

178dd318a36590c115433c04ae1314ab_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

 

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

 

7fc8aee15d507b234edb57be376353d1_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

 

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`