【FPGA/图像处理】点操作——色彩反转
世界Skill
图像处理系列文章基本都是我本科毕设论文同步发布,这个项目以LGPL许可被发布在F-I-L。色彩反转可以看做是变换系数为-1时的对比度变换和变换系数为色彩最大值的亮度变换之和,但考虑到在对比度变换时引入符号计算会增加额外的资源和时序消耗,并且一般情况下也不会有负向对比度变换的需求,所以单独将其提出作为一个模块。色彩反转常用于需要反转背景和主题元素的应用,例如解决某些眼障人群对一些色彩搭配不适,又例如在印刷工艺中的负片等,本节将会介绍如何实现一个色彩反转的IP核。
这个IP核的资源在这里:
ColorReversal
3 算法实现
明确了设计和架构,便可以进行算法的实现。本章将会说明如何实现图像处理的算法,以及如何运用它们。
3.7 点操作——色彩反转
色彩反转可以看做是变换系数为-1时的对比度变换和变换系数为色彩最大值的亮度变换之和,但考虑到在对比度变换时引入符号计算会增加额外的资源和时序消耗,并且一般情况下也不会有负向对比度变换的需求,所以单独将其提出作为一个模块。色彩反转常用于需要反转背景和主题元素的应用,例如解决某些眼障人群对一些色彩搭配不适,又例如在印刷工艺中的负片等,本节将会介绍如何实现一个色彩反转的IP核。
3.7.1 原理
色彩反转的基本原理公式如式3-7-1[3],由于此变换同样适用于任何色彩通道数量和任何色彩位宽的图像,所以需要针对这两个参数来调整IP核的结构,此公式表示了一个像素中一个通道的色彩是如何被变换的,Q为输出,I为输入,N为色彩位宽,可见实现此运算需要一次减法。
但考虑到这种减法的特殊性,即用于减去I的被减数实际上是色彩位宽能够表示的无符号数的最大值,所以可以直接对输入I按位取反来得到输出Q,如式3-7-2,按位取反是简单快速的逻辑运算,理论上比减法的逻辑延时要小,并且实现也更为容易。
可见,色彩反转需要若干次并行的取反运算,同时要根据色彩通道数量和色彩位宽做相应的适配。
3.7.2 设计
根据原理可知,除了第2章的接口标准外,实现一个ColorReversal核(以下简称CR核)也需要根据输入参数做一些适配,但考虑到每一个通道、每一位的运算完全等价,所以不用考虑逻辑复制,直接对输入的每一位取反即可。综上,最终需要的配置参数和端口分别如表3-7-1、表3-7-2所示。
名字 | 类型 | 范围 | 默认值 | 说明 |
---|---|---|---|---|
work_mode | 无符号 | 0为流水线模式,1为请求响应模式 | 0 | 模块的工作模式。 |
color_channels | 无符号 | 无 | 3 | 色彩通道数量,1为灰度,3为RGB等等。 |
color_width | 无符号 | 1 - 12 | 8 | 色彩位宽。 |
名字 | 端口 | 类型 | 范围 | 默认值 | 说明 | 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同步输出。 |
3.7.3 实现
根据3.7.2的设计便可以实现一个CR核,流水线和请求响应两种模式的实现方式如下:
3.7.3.1 流水线模式
保证地址和数据同步流水化输出,在复位时二者皆输出为0,实现如下:
in_enable或rst_n为低时,out_ready输出为0,即输出无效,系统不工作;否则一个周期后第一个数据被输出,并且每一个clk的上升沿都会送入一个数据in_data进行处理,第一个输出数据有效之后,每一个周期都将送出一个有效数据,波形如图3-7-1。

图3-7-1 流水线模式时序
3.7.3.2 请求响应模式
基本同3.7.3.1,但输入数据in_data只有在in_enbale的上升沿才会被送入处理,波形如图3-7-2。

图3-7-2 请求响应模式时序
3.7.3.3 IP核GUI
完成功能后对CR核进行了封装,封装如图3-7-3。

图3-7-3 CR核的GUI
3.7.4 仿真
CR核对于所有图像输入都有意义,所以我选取了一张图像的RGB模式、灰度模式与二值模式(来源于局部二值化,在后面的章节将会介绍)作为仿真源,对每张图进行流水线和请求响应模式的测试,原始图像如图3-7-4,每一张图像的测试流程如下:
流水线模式conf -> 存入*-conf1-pipeline-hdlfun.*内 -> 请求响应模式conf -> 存入*-conf-reqack-hdlfun.*内。

图3-7-4 原始测试图像
使用HDL功能仿真和软件仿真的结果进行PSNR的计算,仿真结果如图3-7-5所示。

图3-7-5 仿真结果,左侧为请求响应模式下的HDL功能仿真结果,中间为流水线模式下的HDL功能仿真结果,右侧为软件仿真结果
3.7.5 资源和时序
由于两种模式的基本构成大致相同,所以只对第一种模式进行分析,根据Vivado生成的报表,主要资源耗费如表3-7-3。
Slice LUTs* | Slice Registers |
---|---|
49 | 25 |
根据时序报告,最大的Data Path Delay(数据路径延迟)为2.298ns,即:
FMax = 435.16MHz
即说明,CR核在流水线模式下,理论上在处理1080p全高清图像时可以达到210帧。
由于数据路径延迟和应用的最终约束设置强相关,所以仅供参考。
3.7.6 分析与结论
根据仿真结果计算PSNR,得到的数据如表3-7-4。
1 | 2 | 3 | Total |
---|---|---|---|
1000000.00 | 1000000.00 | 1000000.00 | 1000000.00 |
PSNR均值为极大值,可见LT核和软件方法完全等效,同时可以达到不错的FMax,设计成功。
参考文献
[3] Donald G.Bailey.基于FPGA的嵌入式图像处理系统设计[M].原魁,何文浩,肖晗译.北京:电子工业出版社,2013
感谢
仿真图像来源:
パセリ-Fallen