【FPGA/图像处理】几何变换-错切

少女dtysky

世界Skill

时刻2015.05.29

错切也是仿射变换的一种特例,它接受水平和垂直两个方向的错切系数,将图像进行扭变,它同样适合进行逆向映射。错切常用于图像校正操作,同时也可以作为旋转变换的中间变换[26]。本节将会说明如何用FPGA实现错切的模块。
这个IP核的资源在这里:
Shear


3 算法实现

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

3.20 几何变换-错切

错切也是仿射变换的一种特例,它接受水平和垂直两个方向的错切系数,将图像进行扭变,它同样适合进行逆向映射。错切常用于图像校正操作,同时也可以作为旋转变换的中间变换[26]。本节将会说明如何用FPGA实现错切的模块。

3.20.1 原理

错切变换的前向映射基本原理如式3-20-1,其中xsh和ysh为两个方向的错切系数。对于逆向映射应该对此式进行调整,变换为3-20-2的形式,$xsh_t$和$ysh_t$为逆向映射系数,没有使用前向映射的逆变换是考虑到错切本身意义模糊,如果采用逆变换会导致算法复杂度大大增加却无法得到理想的效果,所以直接根据前向映射的形式得出了逆向映射。

{Q[xt,yt]=I[x,y]xt=xxsh+yyt=yysh+xxt[0,w),yt[0,h) .        (3201)\begin{cases}Q[x_t,y_t] = I[x,y] \\x_t = x * xsh + y\\ y_t = y * ysh + x\\x_t \in[0, w) ,y_t \in[0, h)\ \end{cases}.\ \ \ \ \ \ \ \ (3-20-1) {I[x,y]=Q[xt,yt]x=xtxsht+yty=ytysht+xtxt[0,w),yt[0,h) .        (3202)\begin{cases}I[x,y] = Q[x_t,y_t] \\x = x_t * xsh_t + y_t\\ y = y_t * ysh_t + x_t\\x_t \in[0, w) ,y_t \in[0, h)\ \end{cases}.\ \ \ \ \ \ \ \ (3-20-2)

输出同样要进行边界判定,这和3.19中基本一致。同时由于涉及到定点数乘法,所以需要确定小数位,考虑到错切系数是有符号的定点数,所以此模块需要乘法器来实现一个无符号数(坐标)和与有符号定点数(错切系数)的乘法,最终确定了在3.19中设计的基础上加上一位符号位来保证精度,即错切系数的范围为(-64,64)。此模块同样涉及到舍入问题,并且是有符号数的舍入问题,故可以采用3.1中论述的FR核来完成舍入,舍入的原理如式3-20-3,$I_s$为符号位,首先判断输入的正负,随后根据正负来确定如何舍入。

Q={IrId1=0Ir+1Id1=1, Is=0Ir1Id1=1, Is=1 .        (3203)Q = \begin{cases}I_r && I_{d1} = 0 \\I_r + 1 && I_{d1} = 1,\ I_s=0\\I_r - 1 && I_{d1} = 1,\ I_s=1\ \end{cases}.\ \ \ \ \ \ \ \ (3-20-3)

同时考虑到舍入核输出的数值将会进行一次加法,所以输出的位数越少越好,故此处设计了一个可选的输出位宽和一个溢出标志,同时在模块内部进行一次比较,来告知外部此次输入的值是否出现了溢出,溢出规则如式3-20-4,Orig为转换后的原码,Of为溢出标志,fp为定点位,resw为指定的输出位宽,numw为原始数据位宽,即在需求位数之外、被截取的高位数值不为0时则判定为溢出,最终只要把这个溢出标志加入到边界判定中即可。

Of={0Orig[numw1:resw]=01Others .        (3204)Of = \begin{cases}0 && Orig[numw - 1 : resw] = 0 \\1 && Others\ \end{cases}.\ \ \ \ \ \ \ \ (3-20-4)

3.20.2 设计

根据原理可知,Shear核(以下简称SHR核)需要两次符号乘法、两次符号舍入操作和两次符号加法,并且需要和基于行列计数的帧控制器进行合作。故其需要的配置参数与端口如表3-20-1和表3-20-2。

名字 类型 范围 默认值 说明
work_mode 无符号 0为流水线模式,1为请求响应模式 0 模块的工作模式。
data_width 无符号 1 - 12 8 数据位宽。
im_width 无符号 1 - 4096 320 图像宽度。
im_height 无符号 1 - 4096 240 图像高度。
im_width_bits 无符号 取决于图像宽度 9 图像宽度的位宽。
mul_delay 无符号 取决于乘法器配置,1-14 3 乘法器延迟。
ram_RL 无符号 取决于帧控制器 7 帧控制器输出延迟。
表3-20-1 配置参数


名字 端口 类型 范围 默认值 说明
clk 输入 无符号 Clock.
rst_n 输入 无符号 复位,低有效。
sh_u input 有符号 定点数,1flag+6bits.18bits 横向错切系数。
sh_v input 有符号 定点数,1flag+6bits.18bits 纵向错切系数。
in_enable 输入 无符号 输入数据使能,在流水线模式下,它是另一个复位信号,在请求响应模式下,只有在它有效的时候in_data才会被真正地改变。
frame_in_ready 输入 无符号 连接到帧控制器的out_ready。
frame_in_data 输入 无符号 data_width - 1 : 0 连接到帧控制器的out_data。
frame_enable output 无符号 连接到帧控制器的in_enable。
frame_out_count_x output 无符号 im_width_bits - 1 : 0 连接到帧控制器的in_count_x。
out_count_y output 无符号 im_width_bits - 1 : 0 连接到帧控制器的in_count_y。
out_ready output 无符号 输出数据有效,在两种模式下,这个信号都会在out_data可以被读取的时候有效。
out_data output 无符号 color_width - 1 : 0 输出数据,将会和out_ready同步输出。
表3-20-2 端口



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

3.20.3 实现

根据3.20.2的设计便可以实现一个SHR核,流水线模式和请求响应模式实现如下。

3.20.3.1 流水线模式

在帧控制器的输出使能后1个周期第一个结果被输出,开始流水化工作,波形如图3-20-1。

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

3.20.3.2 请求响应模式读取

基本同3.20.3.1,但只有在in_enable上升沿时计数器才会加1才会被改变,波形如图3-20-2。

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

3.20.3.3 IP核GUI

完成功能后对SHR核进行了封装,封装如图3-20-3。

图3-20-3 SHR核的GUI
图3-20-3 SHR核的GUI

3.20.4 仿真

只对RGB图像和灰度图像进行测试,考虑到仿真设计模块比较多,出于仿真压力,我选择了一张图像的灰度模式进行三套参数的测试,原始图像如图3-20-4。

图3-20-4 仿真原始图像
图3-20-4 仿真原始图像

仿真参数如表3-16-4所示,选择原则是可以被二进制表示和不可以被表示的值都包含。

ush vsh
0.5 0.5
-1.671 0.539
0.824 -1.793
表3-16-4 仿真参数

仿真并进行PSNR测试,仿真结果如图3-20-5所示。

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

3.20.5 资源和时序

最终实现与图像大小和数据位宽有关,这里只分析大小为512x512和数据位宽为8时的状况,根据Vivado生成的报表,主要资源耗费如表3-20-5。

Slice LUTs* Slice Registers DSP
212 166 2
表3-20-5 主要资源耗费

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

FMax = 243.72MHz

即说明,Shear核在流水线模式下,理论上在处理1080p全高清图像时可以达到117帧。
此FMax低于期望值,分析得知延迟主要来源于舍入核,有符号的舍入操作会涉及原码和补码转换,在此应用中每个周期会有一次35位的加法,如果将加法拆分会得到更好的FMax,但考虑时间此处暂时不做优化。
由于数据路径延迟和应用的最终约束设置强相关,所以仅供参考。

3.20.6 分析与结论

PSNR如表3-20-6。

1--1.671x0.539 1-0.5x0.5 1-0.824x-1.793 Total
52.36 52.38 1000000.00 333368.25
表3-20-6 PSNR

PSNR对于某些参数为最大值,对于一些不是,但均为50以上,可见在测试范围内,SHR核可以满足处理需求,设计成功。


参考文献

[26] 陈芳.一种基于错切原理的图像旋转方法[J].淮阴师范学院学报(自然科学版),2004,3(4):319-322.DOI:10.3969/j.issn.1671-6876.2004.04.016.


感谢

仿真图像来源:
ぜろきち-白の夢

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