【FPGA/图像处理】点操作——对比度变换
世界Skill
其实俺也知道每个简单的操作都写这么一大篇很无聊,但论文就是这样的东西,不是么233?
图像处理系列文章基本都是我本科毕设论文同步发布,这个项目以LGPL许可被发布在F-I-L。对比度变换属于图像增强的一种,图像增强,即增强图像中有用的信息,其目的是是改变图像的视觉想过,针对应用刻意强调图像整体或局部特征,是一个失真的过程。对比度变换是最基础的图像增强运算之一,由于人眼不仅仅是根据色彩的绝对值,还会根据某个区域和其周边的一个对比来得到整体的感受,这个“对比”量化后即为对比度。对比度变换的方式有很多,但差异基本都是变换系数所造成的,系数为常数的变换为线性变换,否则为非线性变换,本节将讨论如何实现线性的对比度变换。
这个IP核的资源在这里:
ContrastTransform
3 算法实现
明确了设计和架构,便可以进行算法的实现。本章将会说明如何实现图像处理的算法,以及如何运用它们。
3.5 点操作——对比度变换
对比度变换属于图像增强的一种,图像增强,即增强图像中有用的信息,其目的是是改变图像的视觉效果,针对应用刻意强调图像整体或局部特征,是一个失真的过程。对比度变换是最基础的图像增强运算之一,由于人眼不仅仅是根据色彩的绝对值,还会根据某个区域和其周边的一个对比来得到整体的感受,这个“对比”量化后即为对比度。对比度变换的方式有很多,但差异基本都是变换系数所造成的,系数为常数的变换为线性变换,否则为非线性变换,本节将讨论如何实现线性的对比度变换。
3.5.1 原理
任何对比度变换都是通过调整变换系数实现的[3],对比度变换的原理公式如式3-5-1,其中I为输入,Q为输出,ct_scale为变换系数,可见其本质实际上是映射函数的斜率,当变换系数大于1时,对比度增强,否则对比度降低。对于线性变换,这个变换系数为常数,即对于所有的输入色彩,所执行的运算都是一致的,这种变换的结果是整张图像所有的像素都被等效变换。
可见,对比度变换需要乘法运算,同时由于对比度变换不仅仅适用于灰度图像,还适用于多通道的彩色图像,并且所有通道的变换形式都是一致的。所以需要提供一个配置接口,用以确定输入图像所含的通道数量,并通过通道数量来对基本的单通道变换复制进行最终变换的实现。
3.5.2 设计
根据原理可知,除了第2章的接口标准外,实现一个ContrastTransform核(以下简称CT核)还需要若干乘法器、输出使能计数器和复位系统,乘法器的数量由输入色彩的通道数量决定,并且每一个通道的运算都是一致的,这个运算有溢出的可能,所以在实现时要考虑对输出作出裁剪,当乘法的结果超出了当前色彩位宽所能表示的最大值时,比如对于8位色彩为255,则裁剪到255,裁剪过程理论上是一个“大于”的比较过程,但考虑到FPGA在实现“大于”和“小于”运算综合后是加法器实现的,会造成一定的性能影响,所以这里采用“等于”运算来替代。例如,对于8位和8位的无符号乘法,要将输出裁剪为8位,则如式3-5-2,其中Res为16位的相乘结果,Q为最终输出,Res的高八位看作是溢出位,将这高八位组成一个新的无符号数,大于0时则可以判定为溢出。
综上,最终需要的配置参数、端口和子模块分别如表3-5-1、表3-5-2与表3-5-3所示。
| 名字 | 类型 | 范围 | 默认值 | 说明 |
|---|---|---|---|---|
| work_mode | 无符号 | 0为流水线模式,1为请求响应模式 | 0 | 模块的工作模式。 |
| color_channels | 无符号 | 无 | 3 | 色彩通道数量,1为灰度,3为RGB等等。 |
| color_width | 无符号 | 1 - 12 | 8 | 色彩位宽。 |
| mul_delay | 无符号 | 取决于乘法器的配置。 | 3 | 乘法器输出延迟(流水线级数)。 |
| 名字 | 端口 | 类型 | 范围 | 默认值 | 说明 | clk | 输入 | 无符号 | 无 | 无 | Clock. |
|---|---|---|---|---|---|
| rst_n | 输入 | 无符号 | 无 | 无 | 复位,低有效。 |
| ct_scale | input | 无符号 | 23 : 0 | 无 | 对比度变换系数,定点数,12bits.12bis。 |
| 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同步输出。 |
| 名字 | 类型 | 说明 |
|---|---|---|
| Mul | Multiplier12x24CT | 12位无符号数和24位无符号数的乘法器,被用于定点数的乘法。你可以自己配置这个乘法器,然后更改"mul_delay",但所有的乘法器必须拥有相同的流水线级数,并且不能更改端口的配置! |
3.5.3 实现
根据3.5.2的设计便可以实现一个CT核,流水线和请求响应两种模式的实现方式如下:
3.5.3.1 流水线模式
保证地址和数据同步流水化输出,在复位时二者皆输出为0,实现如下:
in_enable或rst_n为低时,out_ready输出为0,即输出无效,系统不工作;否则系统根据ct_scale进行工作,计数器在乘法器延迟加1个周期(默认为4)后使能输出有效,第一个数据被输出,并且每一个clk的上升沿都会送入一个数据in_data进行处理,第一个输出数据有效之后,每一个周期都将送出一个有效数据,波形如图3-5-1。

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

图3-5-2 请求响应模式时序
3.5.3.3 IP核GUI
完成功能后对CT核进行了封装,封装如图3-5-3,work_mode被设计为键值对的模式,方便用户理解和选择,其它参数都根据实际状况加上了范围限定。

图3-5-3 CT核的GUI
3.5.4 仿真
CT核对于二值操作没有意义,所以我选取了一张图像的RGB模式和灰度模式作为仿真源,并分别设置了两套参数(理论上可以设置任意套参数),参数的选取原则是不可由有限二进制定点数表示,以此来得到最坏情况下的PSNR,参数如表3-5-4。
| ct_scale |
|---|
| 0.2 |
| 3.3 |
对每种参数进行流水线和请求响应模式的测试,原始图像如图3-5-4,每一张图像的测试流程如下:
流水线模式conf1 -> 存入*-conf1-pipeline-hdlfun.*内 -> 请求响应模式conf1 -> 存入*-conf1-reqack-hdlfun.*内 -> 流水线模式conf2 -> 存入*-conf2-pipeline-hdlfun.*内 -> 请求响应模式conf2 -> 存入*-conf2-reqack-hdlfun.*内。

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

图3-5-5 仿真结果,左侧为请求响应模式下的HDL功能仿真结果,中间为流水线模式下的HDL功能仿真结果,右侧为软件仿真结果
3.5.5 资源和时序
由于两种模式的基本构成大致相同,所以只对第一种模式进行分析,根据Vivado生成的报表,主要资源耗费如表3-5-5。
| Slice LUTs* | Slice Registers | DSP |
|---|---|---|
| 38 | 27 | 3 |
根据时序报告,最大的Data Path Delay(数据路径延迟)为2.746ns,即:
FMax = 364.16MHz
即说明,CT核在流水线模式下,理论上在处理1080p全高清图像时可以达到175帧。
由于数据路径延迟和应用的最终约束设置强相关,所以仅供参考。
3.5.6 分析与结论
根据仿真结果计算PSNR,得到的数据如表3-5-6。
| 1-0.2 | 1-3.3 | 2-0.2 | 2-3.3 | Total |
|---|---|---|---|---|
| 55.11 | 61.09 | 55.09 | 59.53 | 57.70 |
PSNR均值为57.70,可见CT核满足处理要求,同时可以达到不错的FMax,设计成功。
参考文献
[3] Donald G.Bailey.基于FPGA的嵌入式图像处理系统设计[M].原魁,何文浩,肖晗译.北京:电子工业出版社,2013
感谢
仿真图像来源:
LM7-sn