【FPGA/图像处理】点操作——对比度变换

少女dtysky

世界Skill

时刻2015.05.16

其实俺也知道每个简单的操作都写这么一大篇很无聊,但论文就是这样的东西,不是么233?
图像处理系列文章基本都是我本科毕设论文同步发布,这个项目以LGPL许可被发布在F-I-L。对比度变换属于图像增强的一种,图像增强,即增强图像中有用的信息,其目的是是改变图像的视觉想过,针对应用刻意强调图像整体或局部特征,是一个失真的过程。对比度变换是最基础的图像增强运算之一,由于人眼不仅仅是根据色彩的绝对值,还会根据某个区域和其周边的一个对比来得到整体的感受,这个“对比”量化后即为对比度。对比度变换的方式有很多,但差异基本都是变换系数所造成的,系数为常数的变换为线性变换,否则为非线性变换,本节将讨论如何实现线性的对比度变换。
这个IP核的资源在这里:
ContrastTransform


3 算法实现

明确了设计和架构,便可以进行算法的实现。本章将会说明如何实现图像处理的算法,以及如何运用它们。

3.5 点操作——对比度变换

对比度变换属于图像增强的一种,图像增强,即增强图像中有用的信息,其目的是是改变图像的视觉效果,针对应用刻意强调图像整体或局部特征,是一个失真的过程。对比度变换是最基础的图像增强运算之一,由于人眼不仅仅是根据色彩的绝对值,还会根据某个区域和其周边的一个对比来得到整体的感受,这个“对比”量化后即为对比度。对比度变换的方式有很多,但差异基本都是变换系数所造成的,系数为常数的变换为线性变换,否则为非线性变换,本节将讨论如何实现线性的对比度变换。

3.5.1 原理

任何对比度变换都是通过调整变换系数实现的[3],对比度变换的原理公式如式3-5-1,其中I为输入,Q为输出,ct_scale为变换系数,可见其本质实际上是映射函数的斜率,当变换系数大于1时,对比度增强,否则对比度降低。对于线性变换,这个变换系数为常数,即对于所有的输入色彩,所执行的运算都是一致的,这种变换的结果是整张图像所有的像素都被等效变换。

Q=ct_scaleI        (351)Q=ct\_scale * I\ \ \ \ \ \ \ \ (3-5-1)

可见,对比度变换需要乘法运算,同时由于对比度变换不仅仅适用于灰度图像,还适用于多通道的彩色图像,并且所有通道的变换形式都是一致的。所以需要提供一个配置接口,用以确定输入图像所含的通道数量,并通过通道数量来对基本的单通道变换复制进行最终变换的实现。

3.5.2 设计

根据原理可知,除了第2章的接口标准外,实现一个ContrastTransform核(以下简称CT核)还需要若干乘法器、输出使能计数器和复位系统,乘法器的数量由输入色彩的通道数量决定,并且每一个通道的运算都是一致的,这个运算有溢出的可能,所以在实现时要考虑对输出作出裁剪,当乘法的结果超出了当前色彩位宽所能表示的最大值时,比如对于8位色彩为255,则裁剪到255,裁剪过程理论上是一个“大于”的比较过程,但考虑到FPGA在实现“大于”和“小于”运算综合后是加法器实现的,会造成一定的性能影响,所以这里采用“等于”运算来替代。例如,对于8位和8位的无符号乘法,要将输出裁剪为8位,则如式3-5-2,其中Res为16位的相乘结果,Q为最终输出,Res的高八位看作是溢出位,将这高八位组成一个新的无符号数,大于0时则可以判定为溢出。

Q={Res[7:0]Res[15:8]=0255Res[15:8]0 .        (352)Q=\begin{cases} Res[7 : 0] && Res[15 : 8] = 0 \\255 & & Res[15 : 8] \neq 0 \ \end{cases}.\ \ \ \ \ \ \ \ (3-5-2)

综上,最终需要的配置参数、端口和子模块分别如表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 乘法器输出延迟(流水线级数)。
表3-5-1 配置参数


名字 端口 类型 范围 默认值 说明
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同步输出。
表3-5-2 端口


名字 类型 说明
Mul Multiplier12x24CT 12位无符号数和24位无符号数的乘法器,被用于定点数的乘法。你可以自己配置这个乘法器,然后更改"mul_delay",但所有的乘法器必须拥有相同的流水线级数,并且不能更改端口的配置!
表3-3-3 子模块

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-1 流水线模式时序

3.5.3.2 请求响应模式

基本同3.5.3.1,但输入数据in_data只有在in_enbale的上升沿才会被送入处理,波形如图3-5-2。

图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-3 CT核的GUI

3.5.4 仿真

CT核对于二值操作没有意义,所以我选取了一张图像的RGB模式和灰度模式作为仿真源,并分别设置了两套参数(理论上可以设置任意套参数),参数的选取原则是不可由有限二进制定点数表示,以此来得到最坏情况下的PSNR,参数如表3-5-4。

ct_scale
0.2
3.3
表3-5-4 仿真参数

对每种参数进行流水线和请求响应模式的测试,原始图像如图3-5-4,每一张图像的测试流程如下:

流水线模式conf1 -> 存入*-conf1-pipeline-hdlfun.*内 -> 请求响应模式conf1 -> 存入*-conf1-reqack-hdlfun.*内 -> 流水线模式conf2 -> 存入*-conf2-pipeline-hdlfun.*内 -> 请求响应模式conf2 -> 存入*-conf2-reqack-hdlfun.*内。

图3-5-4 原始测试图像
图3-5-4 原始测试图像

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

图3-5-5 仿真结果
图3-5-5 仿真结果,左侧为请求响应模式下的HDL功能仿真结果,中间为流水线模式下的HDL功能仿真结果,右侧为软件仿真结果

3.5.5 资源和时序

由于两种模式的基本构成大致相同,所以只对第一种模式进行分析,根据Vivado生成的报表,主要资源耗费如表3-5-5。

Slice LUTs* Slice Registers DSP
38 27 3
表3-5-5 主要资源耗费

根据时序报告,最大的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
表3-5-6 PSNR

PSNR均值为57.70,可见CT核满足处理要求,同时可以达到不错的FMax,设计成功。


参考文献

[3] Donald G.Bailey.基于FPGA的嵌入式图像处理系统设计[M].原魁,何文浩,肖晗译.北京:电子工业出版社,2013


感谢

仿真图像来源:
LM7-sn

如果不是自己的创作,少女是会标识出来的,所以要告诉别人是少女写的哦。