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

少女dtysky

世界Skill

时刻2015.05.17

图像处理系列文章基本都是我本科毕设论文同步发布,这个项目以LGPL许可被发布在F-I-L。亮度变换同样是最基础的图像增强运算之一,通过3.3的论述可知,亮度实际上是像素的各个通道色彩分量的一个线性函数,故可以通过更改每个通道的色彩值来进行亮度的变换。所以,亮度变换就是对图像中每一个像素的色彩进行增加或者减少的线性变换,与对比度变相相同,亮度变换的方式也有很多,差异也基本都是变换系数所造成的,系数为常数的变换为线性变换,否则为非线性变换,本节将讨论如何实现线性的亮度变换。
这个IP核的资源在这里:
LightnessTransform


3 算法实现

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

3.6 点操作——亮度换变

亮度变换同样是最基础的图像增强运算之一,通过3.3的论述可知,亮度实际上是像素的各个通道色彩分量的一个线性函数,故可以通过更改每个通道的色彩值来进行亮度的变换。所以,亮度变换就是对图像中每一个像素的色彩进行增加或者减少的线性变换,与对比度变相相同,亮度变换的方式也有很多,差异也基本都是变换系数所造成的,系数为常数的变换为线性变换,否则为非线性变换,本节将讨论如何实现线性的亮度变换。

3.6.1 原理

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

Q=I+lm_gain        (361)Q=I + lm\_gain\ \ \ \ \ \ \ \ (3-6-1)

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

3.6.2 设计

根据原理可知,除了第2章的接口标准外,实现一个LightnessTransform核(以下简称LT核)还需要有符号加法、输出使能计数器和复位系统,执行加法的次数的数量由输入色彩的通道数量决定,并且每一个通道的运算都是一致的,这个运算有溢出的可能,所以在实现时要考虑对输出作出裁剪,当加法的结果为负数或者超出了当前色彩位宽所能表示的最大值时,比如对于8位色彩为255,则裁剪到0或255。例如,对于9位和9位的有符号加法,要将输出裁剪到允许的输出范围内,则如式3-6-2,其中Res为10位的相加结果,Q为最终输出,Res的最高位为符号位,次高位看作是溢出位,符号位决定是否裁剪到0,溢出位决定是否裁剪到255。

Q={0Res[9]=1Res[7:0]Res[9]=0 & Res[8]=0255Res[9]=0 & Res[8]=1 .        (362)Q=\begin{cases} 0 && Res[9] = 1 \\Res[7 : 0] && Res[9] = 0 \ \&\ Res[8] = 0 \\255 & & Res[9] = 0 \ \&\ Res[8] = 1 \ \end{cases}.\ \ \ \ \ \ \ \ (3-6-2)

综上,最终需要的配置参数和端口分别如表3-6-1、表3-6-2所示。

名字 类型 范围 默认值 说明
work_mode 无符号 0为流水线模式,1为请求响应模式 0 模块的工作模式。
color_channels 无符号 3 色彩通道数量,1为灰度,3为RGB等等。
color_width 无符号 1 - 12 8 色彩位宽。
表3-6-1 配置参数


名字 端口 类型 范围 默认值 说明
clk 输入 无符号 Clock.
rst_n 输入 无符号 复位,低有效。
lm_gain input 有符号 color_width : 0 亮度变换系数,有符号数,当大于零时,它的值必须是原码,小于零时则必须是补码。
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-6-2 端口

3.6.3 实现

根据3.6.2的设计便可以实现一个LT核,流水线和请求响应两种模式的实现方式如下:

3.6.3.1 流水线模式

保证地址和数据同步流水化输出,在复位时二者皆输出为0,实现如下:
in_enable或rst_n为低时,out_ready输出为0,即输出无效,系统不工作;否则系统根据lm_gain进行工作,计数器在2个周期后使能输出有效,第一个数据被输出,并且每一个clk的上升沿都会送入一个数据in_data进行处理,第一个输出数据有效之后,每一个周期都将送出一个有效数据,波形如图3-6-1。

图3-6-1 流水线模式时序
图3-6-1 流水线模式时序

3.6.3.2 请求响应模式

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

图3-6-2 请求响应模式时序
图3-6-2 请求响应模式时序

3.6.3.3 IP核GUI

完成功能后对LT核进行了封装,封装如图3-6-3,work_mode被设计为键值对的模式,方便用户理解和选择,其它参数都根据实际状况加上了范围限定。

图3-6-3 LT核的GUI
图3-6-3 LT核的GUI

3.6.4 仿真

LT核对于二值操作没有意义,所以我选取了一张图像的RGB模式和灰度模式作为仿真源,并分别设置了两套参数(理论上可以设置任意套参数),参数如表3-6-3。

lm_gain
-90
100
表3-3-4 仿真参数

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

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

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

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

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

3.6.5 资源和时序

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

Slice LUTs* Slice Registers
67 57
表3-6-4 主要资源耗费

根据时序报告,最大的Data Path Delay(数据路径延迟)为2.533ns,即:

FMax = 394.78MHz

即说明,LT核在流水线模式下,理论上在处理1080p全高清图像时可以达到190帧。
由于数据路径延迟和应用的最终约束设置强相关,所以仅供参考。

3.6.6 分析与结论

根据仿真结果计算PSNR,得到的数据如表3-6-5。

1--90 1-100 2--90 2-100 Total
1000000.00 1000000.00 1000000.00 1000000.00 1000000.00
表3-6-5 PSNR

PSNR均值为极大值,可见LT核和软件方法完全等效,同时可以达到不错的FMax,设计成功。


参考文献

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


感谢

仿真图像来源:
LM7-NL

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