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

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

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
```

相关文章
|
2月前
|
监控 算法 数据安全/隐私保护
基于三帧差算法的运动目标检测系统FPGA实现,包含testbench和MATLAB辅助验证程序
本项目展示了基于FPGA与MATLAB实现的三帧差算法运动目标检测。使用Vivado 2019.2和MATLAB 2022a开发环境,通过对比连续三帧图像的像素值变化,有效识别运动区域。项目包括完整无水印的运行效果预览、详细中文注释的代码及操作步骤视频,适合学习和研究。
|
2月前
|
算法 计算机视觉 Python
圆形检测算法-基于颜色和形状(opencv)
该代码实现了一个圆检测算法,用于识别视频中的红色、白色和蓝色圆形。通过将图像从RGB转换为HSV颜色空间,并设置对应颜色的阈值范围,提取出目标颜色的区域。接着对这些区域进行轮廓提取和面积筛选,使用霍夫圆变换检测圆形,并在原图上绘制检测结果。
95 0
|
3月前
|
编解码 算法 图形学
同一路RTSP|RTMP流如何同时回调YUV和RGB数据实现渲染和算法分析
我们播放RTSP|RTMP流,如果需要同时做渲染和算法分析的话,特别是渲染在上层实现(比如Unity),算法是python这种情况,拉两路流,更耗费带宽和性能,拉一路流,同时回调YUV和RGB数据也可以,但是更灵活的是本文提到的按需转算法期望的RGB数据,然后做算法处理
|
4月前
|
编解码 算法 Linux
Linux平台下RTSP|RTMP播放器如何跟python交互投递RGB数据供视觉算法分析
在对接Linux平台的RTSP播放模块时,需将播放数据同时提供给Python进行视觉算法分析。技术实现上,可在播放时通过回调函数获取视频帧数据,并以RGB32格式输出。利用`SetVideoFrameCallBackV2`接口设定缩放后的视频帧回调,以满足算法所需的分辨率。回调函数中,每收到一帧数据即保存为bitmap文件。Python端只需读取指定文件夹中的bitmap文件,即可进行视频数据的分析处理。此方案简单有效,但应注意控制输出的bitmap文件数量以避免内存占用过高。
|
4月前
|
算法
计算空间物体包围球的两种算法实现
计算空间物体包围球的两种算法实现
58 0
|
4月前
|
算法 C++
空间中判断点在三角形内算法(方程法)
空间中判断点在三角形内算法(方程法)
68 0
|
4月前
|
算法
空间点与直线距离算法
空间点与直线距离算法
61 0
|
4月前
|
算法 C++
空间直线与球面相交算法
空间直线与球面相交算法
44 0
|
6月前
|
算法 C语言 Ruby
分形逃逸时间算法中的 Normalized Iteration Count(NIC)技术 让颜色更柔和
Normalized Iteration Count (NIC) 技术是一种提升逃逸时间算法中分形图像质量的方法,它产生更平滑的颜色过渡。数学公式表示为:`mu = n + 1 - log(log(|Z(n)|)) / log(p)`,其中 `Z(n)` 是迭代次数,`|Z(n)|` 是复数模长,`p` 通常取2。示例代码提供了 Ruby, Maxima 和 C 语言的实现。
|
5月前
|
算法 异构计算
FPGA强化(10):基于Sobel算法的边缘检测(二)
FPGA强化(10):基于Sobel算法的边缘检测(二)
106 0