双三次插值图像旋转_基于FPGA 的图像缩放算法设计

双三次插值图像旋转_基于FPGA 的图像缩放算法设计_第1张图片

介绍双线性插值算法来实现图像缩放,FPGA 硬件实现方法,包括图像数据缓冲单元、插值系数生成单元以及插值计算单元等。

图像是人类感知世界的视觉基础,是人类获取信息、表达信息的重要手段。现在研究较多的是数字图像,它是由连续函数或离散函数生成的抽象图像,能直接被计算机处理。图像缩放是数字图像处理的重要一环,在实际应用中经常要将图像进行放大或缩小。例如,等离子电视、液晶电视和发光二极管(LED)显示屏等显示器需将接收到的图像分辨率进行缩放, 使之与显示器的物理分辨率一致,才能在显示器上完整地显示视频图像。

双三次插值图像旋转_基于FPGA 的图像缩放算法设计_第2张图片

一、双线性插值算法原理

1.1、图像缩放算法选择

图像缩放算法种类较多,几乎都是通过插值算法实现的,传统的插值算法有:最近邻插值、双线性插值和立方卷积插值等。最简单的插值方法是最近邻插值,与其他两种插值算法相比,最近邻插值具有简单快速的特点,但是对于近邻像素点的灰度值有较大改变,细微结构是粗糙的。双线性插值方法具有低通滤波器性质,使高频信息受损,图像轮廓模糊,但边缘处的过渡比较自然。与最近邻插值相比,它的计算量较大,但缩放后的图像质量高, 不会出现像素值不连续的情况,在对图像边缘质量要求不是非常高的情况下,这种方法是完全可以接受的。立方卷积法计算量要比双线性插值大很多,但精度高,能保持较好的图像边缘细节。实际应用中,因为 FPGA 内的逻辑资源有限,而算法越复杂占用的逻辑资源就越多,对FPGA完成图像的实时缩放有重要影响,所以实际应用中应选择合适的算法,并非精度越高越好。综上所述,本文选用双线性插值算法来实现图像缩放。

1.2、双线性插值算法

在双线性插值中,新创建的图像的像素值是由原图像位置在它附近的(2 x 2)个邻近像素的值通过加权平均计算得出的,然后由新图像的某个像素( y', x' )处,对( y',x' )取整得到 (v,u) 并得到 (1+ v,u ),(v,u +1),( v+1,u+1) 的值,利用双线性插值得到像素点 ,(y,x) 的值并写回新图像。

双三次插值图像旋转_基于FPGA 的图像缩放算法设计_第3张图片

图1 双线性插值原理图

设原始图像中相邻两列的 4个像素点为 p 1、p 2 、p 3 、p 4 ,水平和垂直两个方向点距为单位长度 l。4 点坐标分别为 p(x,y),p(x+1,y),p(x,y+1),p(x+1,y+1) 目标像素点的坐标为A(x+dx,y+dy),dx、dy 分别是目标像素点与原始图像中邻近点的水平和垂直坐标方向上的两个增量。那么,采用双线性插值法得到目标插值像素点A的灰度值为:

a075dbfeaf3292a9f1b8f251ef877e5c.png

考虑以FPGA来实现插值运算时,共需要8个乘法器、2个减法器和4个加法器,占用了较多的逻辑资源,所以将它改写为:

67249eff064b778f90bd78fc4c7d5b61.png

1.3、算法的 FPGA 实现

整个算法主要由图像数据缓冲模块、系数生成和逻辑控制模块、双线性插值计算模块等3大模块来实现,如图 2。

双三次插值图像旋转_基于FPGA 的图像缩放算法设计_第4张图片

图 2 用 FPGA实现双线性插值的系统框图

1.3.1、图像数据缓冲

数字视频信号的数据量很大,传输带宽特别高。在用硬件系统对数字视频图像进行实时处理时,需要建立一个图像数据的存储缓冲机制,为插值运算及时准确地提供图像数据。一般情况下需要采用片外大容量高速存储器存储至少两帧的图像数据,利用"Ping-Pong" 轮换机制实现图像数据缓冲。当需要使用一帧内像素点数据时,可以及时从一个存储器中读取;与此同时,连续的图像数据被存至另一个存储器中。但是,这样的帧存储器不仅增加了成本,还要在 FPGA 内利用逻辑模块设计帧存控制逻辑。为了降低成本,提高系统集成度,利用FPGA的内部逻辑资源为每一彩色通道设计了一组由3个双端口 RAM 组成的图像数据缓冲阵列,并将这样一个缓冲阵列称为行缓冲器。

1.3.2、插值系数生成

根据双线性插值运算公式及二维图像插值的 FPGA 实现方法,两个运算系数dx和 dy 需要准确及时地求出,提供给插值运算单元,并且只有当生成的系数在时序节拍上与图像数据存储、插值计算单元的时序配合一致时,才能有效地完成整幅图像的插值运算。因此,在生成系数的同时,必须能够给出系数在原图像中对应邻近像素点的坐标信息,即在 DPRAM 中的存储地址,以便图像数据缓冲模块可以同步地取出参与运算的4个图像数据。

首先需要确定缩放因子S。对于以单位长度"1"来表示相邻两个像素点的距离的模型进行缩放时,以S为间隔形成一个新采样格栅,重新对原图像在水平和垂直两个方向上进行重采样,新图像的像素点距离即为S。如果把分辨率为640x480的图像转化为800x600的图像,就需要放大1.25倍,则缩放因子为S=l/1.25,如果把分辨率为1024x768的图像转化为 800x600,将图像缩小0.78125倍时,缩放因子为S=l/0.78125,上述两种情况下,目标图像在水平和垂直两个方向的缩放比例是一样的。若在水平和垂直两个方向上的缩放比例不一致,则缩放因子也就不相同,分别定义为 S_x 和 S_y。那么,对应于新图像中坐标为(m,n)的像素点,系数 dx 和 dy 可以由公式(2)得到:

4faae1f293efeb41d8ba52805875cdf4.png

式中[ ]表示下取整。

1.4、双线性插值运算单元

在获取插值像素点相邻4点的图像数据和插值系数后,就可以进行双线性插值运算了。依据插值公式,设计了一种具有流水线特性的运算逻辑结构如图 3。

双三次插值图像旋转_基于FPGA 的图像缩放算法设计_第5张图片

图 3 双线性插值运算单元

图中,p 1、p 2 、p 3 和 p 4 由 DPRAM 实时输出,dx和 dy则由系数生成单元提供。逻辑实现过程中,要特别注意时序节拍的控制,力求时序同步。当某个运算步骤输出数据与其他运算的输出值在某个时钟不能同步到达下一个运算器时,在数据线上插入延时单元,使它们能达到同步,并且适当增加乘法器和加法器等的流水线延时。

1.5、功能实现

整个硬件模块在像素间距为 20mm的发光二极管(LED)显示屏中得到了成功应用,虽然从理论上讲,利用双线性插值算法实现图像缩放存在边缘高频分量的损失,但从 LED显示屏的显示效果来看,人眼完全可以接受,所采用的算法适合于这一工程应用。显示效果如图4中的(a)、(b)、(c)所示。

双三次插值图像旋转_基于FPGA 的图像缩放算法设计_第6张图片

图 4 图像缩放显示.(a)100%显示;(b)放大 1.5倍显示;(c)缩小 0.7倍显示

1.6、总结

在权衡算法复杂度、缩放效果和 FPGA逻辑资源等3大因素后,选择了双线性插值算法来实现图像缩放。虽然该算法在理论上会造成被缩放图像边缘高频分量的损失,使图像边缘模糊,但在很多对图像质量要求不是很严格的场合,比如在LED显示屏上播放视频图像,所获得的图像质量是人眼完全可以接受的,效果良好。

对FPGA感兴趣的朋友,多多关注我,互相探讨。

你可能感兴趣的:(双三次插值图像旋转)