【FPGA/图像处理】点操作——灰度化
世界Skill
图像处理系列文章基本都是我本科毕设论文同步发布,这个项目以LGPL许可被发布在F-I-L。灰度化是最基本的图像操作之一,它的目的是把一个具有RGB三个灰度通道的图像转换为只具有一个灰度通道的图像,这样做的目的主要是减少后期操作的运算量,因为对于许多应用而言,例如边缘检测、角点识别等,一个灰度通道就已经提供了足够的信息量,甚至在很多情况下,多通道的灰度图会在提高计算复杂度的同时降低运算效果。灰度化属于点操作,一个像素的输出只取决于一个像素的输入,输出像素是输入像素的一个映射,本节将会探讨如何用FPGA实现图像的灰度化。
这个IP核的资源在这里:
Graying
3 算法实现
明确了设计和架构,便可以进行算法的实现。本章将会说明如何实现图像处理的算法,以及如何运用它们。
3.3 点操作——灰度化
灰度化是最基本的图像操作之一,它的目的是把一个具有RGB三个灰度通道的图像转换为只具有一个灰度通道的图像,这样做的目的主要是减少后期操作的运算量,因为对于许多应用而言,例如边缘检测、角点识别等,一个灰度通道就已经提供了足够的信息量,甚至在很多情况下,多通道的灰度图会在提高计算复杂度的同时降低运算效果。灰度化属于点操作,一个像素的输出只取决于一个像素的输入,输出像素是输入像素的一个映射,本节将会探讨如何用FPGA实现图像的灰度化。
3.3.1 原理
灰度化的算法有许多种,最直观的如式3-3-1,即将去三个通道的平均值作为灰度化的结果,这个算法虽然符合一般的逻辑规律,但却不符合人类的视觉,业界通用的灰度化算法如式3-3-2,这个算法在ITU-R(ITU Radiocommunication Sector,国际电信联盟无线电通信组)的ITU BT.601建议书[12]中被定义。根据彩色电视系统的传输要求,色彩信号被分为亮度信号Y和色差信号R-Y、G-Y与B-Y,实际传输时只需要传输亮度信号和任意两个色差信号即可。实际上,亮度信号是根据人类的视觉心理原理计算的,它体现了各个基色的亮度总和。
$$Y = \frac{Red + Green + Blue}3\ \ \ \ \ \ \ \ (3-3-1)$$
$$Y = Red * 0.299 + Green* 0.587 + Blue * 0.114\ \ \ \ \ \ \ \ (3-3-2)$$
所以一次灰度化运算要执行三次乘法和两次加法,其中每一次乘法都是一个固定系数的小数和一个整数的乘法,加法的位数根据每一个通道的色彩位宽而定,由于本项目中色彩位宽被限定为1-12,考虑到FPGA的特性,在一次灰度化运算中,最多可能需要执行三次定点数乘法和两次12位的无符号加法运算。
3.3.2 设计
根据原理可知,除了需要考虑第2章的接口标准外,还需要使用三个乘法器和两个加法器,乘法器必须使用厂商提供的专用IP核实现,同时为了最高的FMax,一个周期内实现两次12位的加法是不被允许的,所以我将两次加法进行了拆分,设置了缓冲寄存器。不仅如此,考虑到实际应用场合的复杂,完全设定好的乘法器并不能够满足要求,所以我选择将乘法器的配置权交给用户,设定一个配置参数来让用户在配置好乘法器后修改流水线级数,以匹配乘法器的配置,综上,实现一个Graying核(以下简称GY核)需要配置参数、端口以及子模块分别如表3-3-1、表3-3-2和表3-3-3所示。
名字 | 类型 | 范围 | 默认值 | 说明 |
---|---|---|---|---|
work_mode | 无符号 | 0为流水线模式,1为请求响应模式 | 0 | 模块的工作模式。 |
color_width | 无符号 | 1 - 12 | 8 | 色彩位宽。 |
mul_delay | 无符号 | 取决于乘法器的配置。 | 3 | 乘法器延迟 |
名字 | 端口 | 类型 | 范围 | 默认值 | 说明 | clk | 输入 | 无符号 | 无 | 无 | Clock. |
---|---|---|---|---|---|
rst_n | 输入 | 无符号 | 无 | 无 | 复位,低有效。 |
in_enable | 输入 | 无符号 | 无 | 无 | 输入数据使能,在流水线模式下,它是另一个复位信号,在请求响应模式下,只有在它有效的时候in_data才会被真正地改变。 |
in_data | 输入 | 无符号 | color_width - 1 : 0 | 无 | 输入数据,必须和in_enable同步输入。 |
out_ready | output | 无符号 | 无 | 无 | 输出数据有效,在两种模式下,这个信号都会在out_data可以被读取的时候有效。 |
out_data | output | 无符号 | color_width - 1 : 0 | 无 | 输出数据,将会和out_ready同步输出。 |
名字 | 类型 | 说明 |
---|---|---|
MulRed | MultiplierRedx0d299 | 12位无符号数和0.299的定点乘法器,被用于红色通道的计算。你可以自己配置这个乘法器,然后更改"mul_delay",但所有的乘法器必须拥有相同的流水线级数,并不能更改端口的配置! |
MulGreen | MultiplierGreenx0d587 | 12位无符号数和0.587的定点乘法器,被用于绿色通道的计算。你可以自己配置这个乘法器,然后更改"mul_delay",但所有的乘法器必须拥有相同的流水线级数,并不能更改端口的配置! |
MulBlue | MultiplierBluex0d114 | 12位无符号数和0.113的定点乘法器,被用于蓝色通道的计算。你可以自己配置这个乘法器,然后更改"mul_delay",但所有的乘法器必须拥有相同的流水线级数,并不能更改端口的配置! |
3.3.3 实现
根据3.3.2的设计便可以实现一个GY核,此核主要由一个三个执行定参数定点数的乘法器、一个输出使能延时计数器、复位系统和两次12位的无符号数加法构成。乘法器使用厂商提供的乘法器IP核,这里使用的是Vivado中的乘法器IP核,这个IP核可以被配置为许多种模式[13],对于定参数的乘法,它的实现方式可以被配置为Distributed Memory(分布式存储器),Block Memory(块存储器)以及Dedicated Multiplier(专用乘法器),前两者相当于建立一个查找表,用查表的方式来计算乘法,其需求的最佳流水线级数比较小,但逻辑延迟比较大,后者相反,这个可以根据用户自身的需求而定,本节默认配置为专用乘法器实现,以得到理论上最大的FMax。同时,为了达到资源和精度之间的平衡,GY核将使用24位的定点数来近似表示每一个参数,例如对于0.299,它的定点数为:
0.299 ≈ 0.010011001000101101000011 = 0.298999965...
可见完全满足要求,同时,为了达到最高的FMax,并考虑到此GY核对舍入方式不敏感,所以这里的舍入没有采用FR核(见3.1),而是采用向下舍入的方式,直接将定点后的小数位截断,这等同于软件仿真中的int(x)强制类型转换。
而对于加法,由于要达到最高的FMax,在考察了Xilinx专用加法器的流水线后,发现12位无符号加法的最佳流水线级数为1级,所以直接采用自己设计的一级流水线和加法运算符即可实现,实现两次加法总共需要两级流水线,消耗两个周期。
综上,流水线和请求响应两种模式的实现方式如下:
3.3.3.1 流水线模式
保证地址和数据同步流水化输出,在复位时二者皆输出为0,实现如下:
in_enable或rst_n为低时,输出使能延迟计数器不工作,out_ready输出为0,即输出无效,系统不工作;否则计数器工作,直到指定延迟周期(默认为5个周期)后,输出有效,并且每一个clk的上升沿都会送入一个数据in_data进行处理,第一个输出数据有效之后,每一个周期都将送出一个有效数据,波形如图3-3-1。
图3-3-1 流水线模式时序
3.3.3.2 请求响应模式
基本同3.3.3.1,但输入数据in_data只有在in_enbale的上升沿才会被送入处理,波形如图3-3-2。
图3-3-2 请求响应模式时序
3.3.3.3 IP核GUI
完成功能后对GY核进行了封装,封装如图3-3-3,work_mode被设计为键值对的模式,方便用户理解和选择,其它参数都根据实际状况加上了范围限定。
图3-3-3 GY核的GUI
3.3.4 仿真
GY核只对RGB图像有意义,所以我选取了三张RGB模式的图像,分别对它们进行了流水线和请求响应模式的测试,原始图像如图3-3-4,每一张图像的测试流程如下:
流水线模式 -> 存入*-pipeline-hdlfun.*内 -> 请求响应模式 -> 存入*-reqack-hdlfun.*内。
图3-3-4 原始测试图像
使用HDL功能仿真和软件仿真的结果进行PSNR的计算,仿真结果如图3-3-5所示。
图3-3-5 仿真结果,左侧为请求响应模式下的HDL功能仿真结果,中间为流水线模式下的HDL功能仿真结果,右侧为软件仿真结果
3.3.5 资源和时序
由于两种模式的基本构成大致相同,所以只对第一种模式进行分析,并且由于这里的乘法器配置采用的是专用乘法器,所以资源消耗和其他模式可能差距较大,仅供参考。根据Vivado生成的报表,主要资源耗费如表3-3-4。
Slice LUTs* | Slice Registers | DSPs |
---|---|---|
28 | 26 | 3 |
根据时序报告,最大的Data Path Delay(数据路径延迟)为2.265ns,即:
FMax = 441.50MHz
即说明,GY核在流水线模式下,理论上在处理1080p全高清图像时可以达到212帧。
由于数据路径延迟和应用的最终约束设置强相关,所以仅供参考。
3.3.6 分析与结论
根据仿真结果计算PSNR,得到的数据如表3-3-4。
1 | 2 | 3 | Total |
---|---|---|---|
46.73 | 46.96 | 46.83 | 46.84 |
PSNR均值为46.84,可见GY核完全满足图像处理的要求,在配置灵活性高的情况下可以达到很高的FMax,设计成功。
参考文献
[12] ITU-R, Recommendation ITU-R BT.601-7, Studio encoding parameters of digital television for standard 4:3 and wide-screen 16:9 aspect ratios [EB/OL]. 03/2011
[13] Xilinx, Vivado Design Suite, LogiCORE IP Multiplier v12.0, Product Guide, PG108 [EB/OL]. April 2, 2014
感谢
仿真图像来源:
041-尾翼
月岡月穂-星を呑む
LM7-xxxまとめ