|
摘要:本文提出了一种利用STM32F4 微处理器实现JPEG 静态图像压缩编码的方法. 根据图像压缩编码的基本流程,重点讨论了图像编码中DCT 变换的优化和实现,以及基于STM32F4 的图像压缩处理过程. 实验结果表明,采用基于DCT 快速算法结合余弦系数查表法的压缩算法和STM32F4 微处理器的静态图像压缩系统,与传统的基于DCT 方法的系统相比,压缩速度提高了4 倍,图像压缩比例可达14∶ 1,而且图像的峰值信噪比高于30,实现了对图像信号的实时、高效率压缩. 0 引言 JPEG 作为国际静态图像压缩标准,是一项成熟的图像编码技术,压缩比例高、失真小、运行速度快且易于实现,因此,被广泛的应用于多媒体、网络传输等多个领域[1]. 目前,图像压缩编码系统根据应用场合不同有着多种硬件实现方案,如基于FPGA、DSP、ARM 或采用专用集成芯片的方式[2-4].基于ARM-CortexM4 内核的STM32F4 系列微处理器是一款集MCU、DSP、FPU 多种性能一体的数字信号控制器[5]. 其最高主频可达168 MHz,支持多种低功耗模式. 该数字信号控制器中同时整合了微控制器和数字信号处理器的功能与特性,其适用于对运算能力和DSP 指令方面有较高要求的系统,为双芯片设计系统提供了新的单芯片解决方案,应用于图像压缩处理有着明显的优势.本设计采用的是STM32F417 微处理器. 1 图像压缩编码流程 JPEG 为连续色调静止图像压缩编码制定的国际通用标准. 标准包括压缩编码、解码、数据格式三部分[6]. JPEG 定义了两种基本的压缩算法,一种为基于DCT 的有损压缩,包括基本系统、扩展系统. 另一种为预测压缩算法,即无损压缩. 其中,基本DCT 顺序型方式是最常用的压缩方法,其图像压缩编码流程如图1 所示.
DCT 变换与反变换( IDCT) 定义[7]如公式( 1) 和公式( 2) 所示. DCT 变换:
IDCT 变换:
JPEG 静态图像压缩主要包括图像预处理、DCT 变换、量化、熵编码四个过程. 为了提高DCT变换效率,需要在进行DCT 变换之前对图像进行预处理,包括颜色空间转换和像素分块,把图像分割为一系列8 × 8 像素块. DCT 变换的任务是将图像由空间域转换为频率域,从而达到去除数据冗余的目的. 量化过程通过量化表来实现,通过改变量化步长,实现对图像不同比例的压缩.最后,对量化后的数据进行编码,从而生成标准的数据流. 2 基于STM32F4 的图像压缩处理 2. 1 图像预处理 JPEG 标准规定: 压缩处理图像为彩色或灰度图像,若为彩色图像,其色彩分量应该由亮度分量Y 和两个色度分量Cr 和Cb 组成. 由于人眼对亮度信号和色度信号的敏感程度不同,对色度信号分辨率仅为亮度信号分辨率的1 /4,因此,在对彩色图像进行处理时,通常对亮度信号和色度信号采用不同的抽样频率,本系统采用4∶ 2∶ 2 格式.由于本系统原始输入图像为RGB565 格式,因此,首先要对图像进行颜色空间转换,即由RGB 彩色空间转换为YCrCb 空间[6],转换关系式如下:
RGB 空间转换为YUV 空间的实现程序如下: void jutl_cc_rgb2ycc( JSAMPLE * data,int num) { for( i = 0; i < num; i + + ) { a = pcolor[i]. a; b = pcolor[i]. b; c = pcolor[i]. c; pcolor[i].a = ( 0.29900f* a +0. 58700f*b +0.11400f* c) ; / /Y 分量 pcolor[i].b = ( - 0. 16874f* a - 0. 33126f*b +0. 50000f* c +128) ; / /Cb 分量 pcolor[i].c = ( 0.50000f* a -0. 41869f*b -0. 08131f* c +128) ; / /Cr 分量 } } 对图像进行压缩处理前,需要考虑到压缩算法的运行效率与所处理像素块大小的关系. JPEG委员会研究发现,当像素块选择为8 × 8 像素时DCT 变换效果最佳,因此,在进行DCT 变换前要对图像进行分块. 由于DCT 变换要求矩阵元素具有8 bit 精度,且像素值范围为- 128 ~ 127,因此,在进行DCT 变换前要将原像素值减去128. 2. 2 离散余弦变换( DCT) DCT 变换输入端为一系列8 × 8 像素块,该算法按照从左到右,从上至下的扫描方式对图像进行变换. 在整个图像压缩过程中DCT 变换是最为耗时的一部分,其运算速度直接影响图像压缩的实时性[8-10]. 由公式( 1) 可以看出,压缩过程中如果直接进行二维DCT 变换,数据计算量巨大,很难满足系统实时性要求. 因此,必须对算法进行优化,从而降低运算量,提高运算速度. 优化一: 采用快速DCT 算法.将二维DCT 变换转换为两次8 点的一维变换,对每个8 × 8 数据块先做列方向上的DCT 变换,再对得到的矩阵进行行变换. 目前,针对一维DCT 运算有多种快速算法,其中陈氏算法所需要的计算量最小[11]. 将二维DCT 变换分解为一维变换公式[11]如下:
在一维8 点DCT 计算中,若输入数据为data[0],data[1]~ data[7]. 假设: s07 =data[0]+data[7]; s16 =data[1]+data[6]; s25 =data[2]+data[5]; s34 =data[3]+data[4]; s0734 =s07 +s34; s1625 =s16 +s25; d07 =data[0]-data[7]; d16 =data[1]-data[6]; d25 =data[2]-data[5]; d34 =data[3]-data[4]; d0734 =d07 -d34; d1625 =d16 -d25; 则经过一维DCT 计算后,其输出结果为: data[0]=( DCTVAL) ( c4* ( s0734 +s1625) ) ; data[1]=( DCTVAL) ( c1* d07 + c3* d16 + c5* d25 +c7* d34) ; data[2]=( DCTVAL) ( c2* d0734 +c6* d1625); data[3]=( DCTVAL) ( c3* d07 - c7*d16 - c1* d25 -c5* d34) ; data[4]=( DCTVAL) ( c4* ( s0734 -s1625) ) ; data[5]=( DCTVAL) ( c5* d07 - c1*d16 + c7* d25 +c3* d34) ; data[6]=( DCTVAL) ( c6* d0734 -c2*d1625) ; data[7]=( DCTVAL) ( c7* d07 - c5*d16 + c3* d25 -c1* d34); 其中,为ci = cos( 2i + 1) v16 . 通过上述两级计算,完成了一次一维DCT 计算. 由此可以看出,该一维变换主要由两级运算构成,第一级为蝶形运算,其输入为data[i]( i = 0…7) ,经过一系列运算得到蝶形输出结果,作为第二级输入; 第二级为乘法累加运算,这一级的运算主要通过微处理器的专用DSP 指令来实现,STM32F4 提供的单周期乘加指令( MAC) 和单周期SIMD 指令显著提高了DCT 变换速度. 通过该方法,可以大大简化运算级数,优化运算速度.优化二: 采用查表法. 在第二级乘加运算过程中,需要多次用到余弦cos 系数,若每次都重新计算,将会浪费大量时间,因此,本设计采用了查找表方法,即将变换中用到的余弦系数事先存到处理器的ROM 中,在进行DCT 运算时,只需要直接查表即可得到,从而避免了多次重复计算余弦系数,进一步提高了DCT 运算速度.通过上述两种DCT 变换优化方法,大大降低了压缩时间,提高了压缩效率. 同时,在编程过程中,只需编写一次一维DCT 运算代码,然后通过循环完成二维变换. 该循环实现方法: 首次循环时,分别将数据输入指针data 指向输入缓冲区,数据缓存指针tmp 指向临时矩阵缓存区; 第一次DCT 变换时,通过调用输入缓冲区中的输入数据完成一维DCT 运算,同时将运算结果存放在临时矩阵缓冲区中; 第二次循环时,数据输入指针data指向临时矩阵存储缓冲区,以提取第一次DCT 运算结果并作为第二次DCT 运算的输入,而此时数据缓存指针tmp 则指向输入缓冲区,即经过第二次DCT 计算后将结果再次存入最初的输入缓冲区中. 循环运算程序代码如下: for( col = 0; col < DCTSIZE; col + + ) { int ii; DCTVAL * tmp = data; for( ii = 0; ii <DCTSIZE; ii + + ) { tdata[ii]= tmp; tmp + = DCTSIZE; } } 2. 3 量化处理 为了实现图像数据的压缩,必须对数据进行量化处理. 量化是多对一的映射,是造成图像信息损失的主要来源,因此是一个有损过程. 该过程主要是将DCT 变换的64 个系数分别除以一定的步长,然后四舍五入后取整得到量化结果. 由于经DCT 变换后,原图像的大部分信息集中在矩阵的左上角部分,因此,量化表将针对高、低频分量采用不同的量化步长,即对低频部分采用小步长,对于高频部分采用较大的步长. 从而,在尽可能保持原始图像的视觉效果的前提下,获得更高的压缩比. JPEG 标准对量化处理算法描述[6]如下:
其中,F(μ,v)为量化后的DCT 系数,Y( μ,v)为未量化DCT 系数,Q( μ,v)为量化步长,IntegerRound( )表示对量化结果取整. 本系统的量化处理流程图如图2 所示. 由于码书的尺寸和码字的大小都会影响图像的压缩效果,因此,在对图像进行量化处理时必须对二者进行设置[12]. 图像质量Quality ( Q) 与JPEG 标准量化表存在比例关系. 设Q 为质量因子,实际使用量化表q 与标准量化表qs的比例关系[13]为:
量化表的选取直接影响着图像的压缩质量和压缩率,因此,首先为Q( Quality,图像质量) 定义一个1 ~ 100 的变化区间. 根据上述公式( 9) 可知,当Q = 100 时,q 值全部为1; Q = 75 时,q =1 /2 × qs; Q = 50 时,q = qs; Q = 35 时,q = 1. 4 × qs;Q = 1 时,q = 50 × qs .
因此,Q 取100 时,量化表的所有值均取1,压缩的后图像不损失任何信息; Q 取75 时,量化表为JPEG 标准推荐表中各步长的一半; 当Q 取50时,量化表为JPEG 标准推荐量化表; Q 取35 时,量化表为JPEG 标准推荐量化表的各步长扩大1. 4 倍; Q 取1 时,量化表为JPEG 标准推荐表中各步长扩大50 倍. 2.4 编码 编码是图像压缩的最后一步. 经DCT 变换后,图像的大部分能量集中在低频分量部分,其中( 0,0) ( DCT 变换的首行、首列) 为直流( DC) 系数,它表征了8 ×8 子块的平均值,而高频分量经过量化出现了一些0,因此,对DC 系数和其他63 个AC 系数采用分别编码. 由于相邻8 ×8 块的DC 系数之间相关性比较强,采用了差值脉冲编码( DPCM) 方法进行DC 编码. 为了保证低频分量先出现,同时增加连续零的个数,首先对AC 系数进行“Z”( Zig-Zag) 排序,然后,将8 ×8 的矩阵变成一个1 × 64 的矢量,之后再进行亮度和色度编码.实现DC 系数和AC 系数编码的程序如下: voidjhuff_encode_one_block( jpeg_compress_info *cinfo,DCTBLOCK src,JHUFF _ TBL * dc _ tbl,JHUFF_TBL * ac_tbl ) { int diff,ssss, rrrr,code; int rs,k; diff = src[0]; /* DC 编码* / ssss = bit_num( diff) ; jhuff_write_bits( cinfo,dc_tbl ->ecode[ssss],dc_tbl ->esize[ssss]) ; rrrr = 0; /* AC 编码* / for ( k = 1; k < DCTSIZE2; k + + ) { if ( src[k]== 0) /* 计算连续0 的个数* / { rrrr ++ ; } else { while( rrrr > 15) /* 若连0 数大于15,则用( 15,0) 表示* / { show_msg( " < AC: 15,0\n" ) ; jhuff _write _bits (cinfo,ac _tbl ->ecode[0xF0],ac_tbl ->esize[0xF0]) ; rrrr - =16; } ssss = bit_num( src[k]) ; rs = ( ( rrrr << 4) | ssss) ; jhuff _write _bits (cinfo,ac _tbl ->ecode[rs],ac_tbl ->esize[rs]) ; /* 记录编码码长* / code = src[k]; if ( code < 0) code - = 1; jhuff_write_bits( cinfo,code, ssss) ;/* 记录基础编码* / rrrr = 0; …… } } } 3 实验结果与分析 3. 1 实验效果图 通过改变量化表中的量化因子Q,可以改变图像的压缩比. 图像的压缩比越大,所占用的存储器空间将越小,但同时图像的视觉损失也越大,将会影响图片的清晰度. 图3 给出了采用不同量化因子的压缩效果图与原始图像的比较. 其中图3a为未压缩的原始图像,大小为150 KB,图3b 为压缩后的图像大小是15 KB,图3c 为压缩后图像大小是11 KB,图3d 为压缩的图像大小为8. 7KB.由图3 可以看出,当Q 取75 或50 时,压缩后的图像与原始图像没有明显的视觉差别,而当Q 取35时,图像出现了较严重的失真.
3. 2 实验结果分析 选取不同量化因子进行压缩时,图像的比特率( Bit /Pixel) 和峰值信噪比( PSNR) 的变化情况不同[14]. 表1 给出了不同Q 值时的图像的比特率( Bit /Pixel) 和峰值信噪比( PSNR) 的变化情况.从表1 可以看出,当量化因子Q 取50 时,其压缩比可达到14∶ 1,且峰值信噪比仍然高于30,因此,从视觉效果上完全满足人眼观看的需要. 当量化因子Q 取35 时,能够得到更高的压缩比17. 2∶ 1,但其峰值信噪比降低为27. 41,解压缩后图像失真比较明显.
利用STM32F417 微处理器系统,采用文中所介绍的方法,量化因子Q 设置为50 时,处理一幅240 × 320的RGB565 格式图像,压缩过程总耗时约为67 ms,与传统基于DCT 的压缩系统所需的330 ms 相比,压缩效率有了显著提高,同时,在相同压缩比例条件下得到了更高的图像质量.实验结果表明,本文提出的采用DCT 快速算法结合余弦系数查表法,在STM32F417 微处理器平台上进行静态图像压缩具有良好的实时性,能够满足一般图像处理系统的实时性要求. |
| 好东西 先马克 回头好好看看 |
| 学习了。。。 |
上代码额 |
| 学习,代码看看 |
| 好高深 啊 |
| 我只能说呵呵,这不是他该干的事。 |
| 学习了 |
很好,很强大。。。
|
| 感觉好深奥的样子,先留个记号 |
STM32
超强工具——STM32CubeMX 你会用吗?
集结出发! STM32全国研讨会系列之一:ST智能门铃中国首秀
关于STM32启动文件的几个小问题
【银杏科技ARM+FPGA双核心应用】STM32H7系列35——USB_VCP_FS
【银杏科技ARM+FPGA双核心应用】STM32H7系列28——USB_HID
粉丝分享 | 图说CRC原理应用及STM32硬件CRC外设
STM32L151进入低功耗,并由RTC唤醒的故事
[转]stm32控制NFC模块(PN532)源码(P2P,模拟卡,读写卡等
STM32G070RB+LVGL移植
微信公众号
手机版