引言
随着多媒体技术以及通信技术的迅猛发展,高质量数字图像的应用越来越广泛,然而未经压缩的数字图像的数据量非常大,势必会给图像的存储和传输都带来很大的困难,因此对数字图像的有效压缩是不可或缺的。在现有图像压缩编码技术中,静态图像压缩编码标准JPEG以其显著的压缩效率、较低的图像质量损失以及较低的实现复杂度得到了广泛应用,是常用的国际标准。
JPEG静态图像压缩标准于1991年由联合图像专家组JPEG(Joint Picture Expert Group)制定[1]。发展至今,JPEG图像压缩系统在各大通用处理器平台上的软件实现早已成熟,但由于这些算法的实现需要大量系统资源(内存、浮点运算)的消耗,很难直接移植到资源有限的嵌入式平台中。为了实现JPEG图像压缩在嵌入式平台中的应用,不少学者对JPEG编码算法进行了优化,并在ARM微控制器、高性能DSP中进行了实现[24]。由于图像质量及其对处理实时性要求的不断提高,一些学者提出了采用FPGA并行硬件来实现JPEG图像压缩算法的解决方案[5],且取得了不错的效果。
若使用ARM微控制器进行开发,软件方法的实现受限于指令的串行执行,处理速度不会太快,且存在计算性能不足等问题。而使用高性能DSP进行实现时,虽然DSP内部有专门的结构加速实现数字信号处理,但存在开发复杂、可移植性不强等问题,而且由于是串行指令执行系统,仍存在处理速度上的局限。针对单纯使用FPGA进行开发时,虽然硬件并行计算的优势能满足图像编码算法处理性能上的需求,但在图像数据的采集(如USB摄像头)以及数据传输通信(如网络传输)方面,相较嵌入式CPU而言,存在开发难度大、复杂度高、资源消耗多等问题,不利于系统通用平台化实现。要实现完整通用的图像压缩系统,可以采用ARM和FPGA软硬件协同设计的方式来实现整个系统平台,ARM处理器完成数字图像的采集以及压缩后数据的传输,FPGA作为协处理器,通过高速并行计算完成JPEG编码算法的硬件实现。
针对ARM和FPGA这种异构多核的协同开发,核间通信速率通常是系统设计的限制所在,但目前单芯片上集成ARM和FPGA的技术已经很成熟,如Xilinx公司2011年推出的Zynq7000系列芯片[6],片内高性能通信总线很好地解决了核间通信速率这一瓶颈。本文采用搭载有XC7Z020CLG484芯片的ZedBoard平台完整地实现了JPEG图像压缩系统,在利用FPGA并行处理优势加速实现JPEG编码算法的同时,ARM部分便捷地实现了图像数据的采集、简单的预处理,以及压缩后数据的传输等功能。
1系统整体实现结构
系统平台按照处理流程主要分为3个部分:图像数据获取、图像编码处理以及压缩后的数据传输。本系统的整体实现结构如图1所示。
图像数据获取部分主要目的是采集需要压缩处理的图像数据,包括图1中的传输通信模块和图像数据采集模块。本系统平台提供两种实现方式:一种面向实际图像传输应用,通过在嵌入式硬件平台中直接连接数字图像传感器来获取图像数据进行处理;另一种则面向图像处理算法的调试验证,由PC机通过以太网或串口发送特定的图像数据到嵌入式平台中进行图像处理算法的验证。这两种图像数据采集方式均由ARM部分编写相应的驱动程序进行实现。
图像编码处理部分是该系统平台的核心,包括图1中的预处理模块和图像JPEG编码模块。这部分是基于Baseline JPEG算法实现的[7],主要包括图像的色彩空间变换、排序、二维离散余弦变换(2DDCT)、量化、Z字扫描和熵编码等模块,图像经该算法处理后即可得到压缩数据。该部分由ARM和FPGA协同处理实现。
压缩后数据传输部分是指将压缩后的数据由嵌入式硬件平台通过图1中的传输通信模块发送至PC机端,完成图像的解码显示。对于串口发送这一方案,由于传输速度慢,只适用于图像处理算法的验证,要实现PC机端图像的实时显示则需要通过以太网传输。该部分的具体实现在ARM端进行。
其中针对图像数据获取和压缩后数据传输这两部分在ARM端的软件实现,本系统在Zynq7000 SoC的ARM CortexA9双核中移植了Ubuntu Linux操作系统,其具备大量可利用的开源函数库资源,极大地方便了图像传感器驱动和以太网通信的实现。
2 Baseline JPEG编码单元的设计与实现
本系统是在ZedBoard平台上实现的,图像数据的采集由ARM端完成,要实现JPEG编码算法在FPGA中的硬件加速,FPGA需要与ARM进行通信从而获取到需要压缩处理的图像数据。系统中ARM与FPGA核间通信采用的是Zynq7000片内的高性能通信总线AXI_HP,通过DMA的形式进行数据传输,AXI_HP总线最高位宽为64位,理论通信带宽最高可达1200 MB/s。
由于Baseline JPEG编码是使用以DCT为基础的顺序编码工作方式,在编码过程中,先将原图像分割成8×8的数据块(如果是彩色图像,需先进行色彩空间的变换),图像子块按照一定的扫描顺序依次输入,对每一个8×8尺寸图像子块使用二维离散余弦变换去除图像数据在空间上的相关性,然后根据指定的量化表进行数据的量化处理,减少数据大小,再对数据进行Z字扫描,便于数据编码,接着根据指定的熵编码表进行编码,减小数据编码长度,最终得到压缩图像的编码数据。为了充分发挥AXI_HP总线最高64 位传输位宽以及FPGA并行处理等特性,本模块将简单的图像预处理部分在ARM部分进行实现,而2DDCT、量化、Z字扫描、熵编码等部分则在FPGA部分进行硬件加速实现。
2.1ARM部分软件的设计
图像压缩编码部分在ARM端的软件实现主要是完成图像预处理的功能,具体包含色彩空间的变换以及图像数据的排序两个部分。
2.1.1色彩空间变换
JPEG是针对连续色调(灰度和彩色)静止图像压缩编码的标准,由彩色图像传感器获取到的图像通常是由RGB(即红绿蓝)三种颜色分量组成,彩色图像进行JPEG压缩前需要进行色彩空间的转换,通常转换为YCrCb空间,包含一个亮度分量和两个色度分量,由灰度图像传感器获取的灰度图像只有单一亮度分量,不需要转换。
RGB与YCrCb空间转换关系如下:
在进行2DDCT前,需要将图像像素值转换为有符号数,即将幅值减去128,所以使用式(1)进行色彩空间变换时,得到的每个分量值还需减去128以转换为有符号数。这些转换含有浮点运算,为提高处理效率,在ARM端软件实现时可将各浮点运算的结果制成表格,进行色彩空间转换时通过查表的方式实现,节省了浮点运算占用的处理时间。
彩色图像的压缩处理是将色彩空间变换后得到的Y、Cr、Cb三个分量按照灰度图像(单一Y分量)的压缩方法分别进行压缩。本文中主要以Y分量(灰度图像)的压缩为例进行介绍,其他分量的处理方法类似。
2.1.2图像数据排序
JPEG压缩编码是以8×8数据块为基本单元进行编码,一幅图像中所有图像子块是以从左到右、自上往下的顺序进行处理的。本系统在ARM端完成色彩空间的转换得到亮度值后,先对图像数据按照处理顺序进行了重新排列,再通过64 位宽的AXI_HP总线将数据传输给FPGA端进行后续处理。通过这样的设计,FPGA端获取到重新排列后的数据后,便可以直接进行以8×8数据块为基本单元的压缩处理流水实现,无需涉及到图像数据的存储等待时间,可减少总体处理时间。
2.2FPGA部分软件的设计
本系统中在FPGA部分主要是完成对预处理后数据的压缩编码,具体包含2DDCT、量化、Z字扫描以及熵编码4个模块。
2.2.12DDCT
对于2DDCT(二维离散余弦变换)的实现,本文采用行列分解快速算法,先对8×8图像子块的所有行完成一维离散余弦变换(1DDCT),再对变换结果的每一列进行一维离散余弦变换,就可以得到2DDCT的结果。该部分具体实现框图如图2所示,针对AXI_HP总线最高64 位传输位宽的特性,即可实现8个像素的图像数据并行输入,其中行列处理的转换是通过控制8个64位输入、8位输出FIFO的读写进行实现的。1DDCT模块采用Leoffler DCT算法进行优化实现[8],大量减少了乘法器资源的消耗,其中涉及到的浮点小数乘法运算采用定点整数乘法进行替代。
2.2.2量化
量化过程就是将经过二维离散余弦变换后得到的频域系数,根据重要性的不同,分别除以不同的量化步长,从而得到量化结果,具体实现框图略——编者注。为了提高处理速度,采用乘法运算代替除法运算,本文中使用的量化步长是将JPEG标准推荐量化表的倒数乘以211后得到的,并存储在ROM中,经过量化后,将计算结果右移11位即恢复为实际的量化结果。
2.2.3Z字扫描
经过量化处理后,每个8×8图像子块中将出现很多值为0的高频分量,主要集中在8×8矩阵的右下角,使用Z字形扫描的方式将8×8的二维系数矩阵变成一维数据流(第一个为DC系数,其余63个为AC系数),这样可以使0值分量集中,以便之后的数据编码,具体实现框图略——编者注。
2.2.4熵编码
为了减少图像的编码长度,要对Z字扫描后的DC系数和AC系数做基于统计特性的熵编码,该部分主要是DC系数根据直流Huffman编码表进行差分编码,AC系数先进行行程长度编码,再根据交流Huffman编码表进行编码,实现框图如图3所示。其中Huffman编码模块是将JPEG标准推荐的Huffman编码表存储在ROM中,通过查表的方式实现Huffman编码。
3实验及结果分析
本系统实验平台略——编者注,该实验硬件平台主要包括以下几个部分:①Kinect传感器,生成分辨率为640×480的数字图像数据;
②搭载有XC7Z020CLG484芯片的ZedBoard开发板,实现JPEG图像压缩系统;
③无线路由器,连接ZedBoard与PC机,实现以太网通信。
本实验中,Zynq SoC平台ARM部分移植了Ubuntu Linux操作系统,由OpenNI驱动程序获取Kinect传感器生成的图像数据,进行色彩空间的变换得到亮度分量Y,重排序后通过AXI_HP总线传输给FPGA部分。FPGA部分读取ARM端预处理后的图像数据,然后进行图像压缩编码。实现640×480像素灰度图像压缩编码算法的FPGA资源占用量如表1所列,算法实现中涉及640×480尺寸数据的存储,因此消耗了较多的BRAM资源。FPGA部分完成图像压缩编码后,便将压缩后的数据通过AXI_HP总线传输回ARM部分,最后通过以太网传输压缩后图像数据到PC端,进行实时解码显示。
经过实验测试,ARM端CPU运行时钟频率为667 MHz,完成一幅图像数据的采集、预处理等操作,需要耗时约14 ms;FPGA端运行时钟频率为100 MHz,完成ARM端预处理后数据的读取、图像压缩编码等操作,需要307 251个时钟周期,耗时3.07 ms。由于不同复杂度的图像压缩后数据量不一样,所以每幅图像压缩后数据传输回ARM端的时间也不一样。如图4所示的实验测试图样,在具有大量图像细节的情况下,本系统实现的压缩比为13.81,经过FPGA算法压缩完成后的数据传输回ARM需耗时0.03 ms,完成图像压缩处理的时间总消耗不超过17.5 ms。针对Kinect传感器30 fps的帧率而言,该系统在一个图像周期内足以完成图像压缩处理操作,具备良好的实时性。
图4所示为随机获取两幅图像的实验测试结果,测试结果表明,该系统在获得较大压缩比的同时,保留了原始图片的关键信息,能满足实际应用需求。
结语
本文主要介绍了一个基于Zynq SoC的JPEG图像压缩系统的实现过程。该系统按照处理流程划分为图像数据获取、图像编码处理以及压缩后数据传输3个部分。本文创新性的采用了ARM与FPGA软硬件协同设计的方式对JPEG图像压缩系统进行了高效实现,充分结合了ARM与FPGA各自在开发上的特点,并采用Zynq片上高性能AXI_HP总线实现了ARM与FPGA核间高速通信。