JPEG:它是JPEG标准中用于无损压缩的一种独立模式,它使用基于空间域的非量化的DPCM预测编码(差分脉冲编码),然后对预测误差进行Huffman编码。因此,用这种方式压缩的图像经重构以后和原图像完全一样的。它仅使用周围的几个像素对当前像素进行预测,预测公式如下:
JPEG-2000:是目前业界公认最好的静态图像压缩编码标准,该算法具有良好的低比特率压缩性能、可实现感兴趣区(region of interest)编码、渐进传输、良好误差鲁棒性等。更重要的是,所有这些都可以在一个统一的算法里实现。与 JPEG 不同,JPEG-2000采用了离散小波变换,可以将有损和无损集成在同一个算法上:在对小波系数的处理中采用了率失真优化截取的内嵌编码算法,可以对码率进行精确的控制。它的主要的特征下:(1)同时支持有损和无损压缩;(2)压缩效率高;(3)码流的随机访问和处理;(4)良好的抗误差性;JPEG2000 的编码模块组成包括预处理、DWT、均匀量、自适应算术编码和码流组织等五个模块,如下图所示:
JPEG2000 用离散小波变换(DWT)代替 JPEG 的离散余弦变换(DCT)。DWT 具有多分辨率的图像表示功能,它允许嵌入比特流内的分辨率可扩展性。另外,DWT 比 DCT 具有出色的压缩效率更高质量的图像压缩效果,从而 DWT通常应用于图像拼接或整个图像上。这种大规模的应用使得 DWT 可以将在 JPEG 中的8×8 的 DCT 的块效应最小化。DWT 有着出色的编码效率得益于它在大范围内去除图像的相关性。
在无损压缩情况下 JPEG-LS 无算压缩算法要比 JPEG2000 无损压缩算法性能要好。
(2)峰值信噪比 PSNR
峰值信噪比(PSNR)是评价图像质量的一种较为常见的指标。若要得到一幅重建图像的峰值信噪比的值,需要计算它与原图像之间的均方误差,并作处理后得到。其计算公式如下:
其中H、W、n分别代表两幅图片的高度,宽度和像素位宽。峰值信噪比是评价重建图像质量时比较重要的指标,不过这一指标也存在着诸多局限。一些研究表明,峰值信噪比的数值可能与人眼对于图像的评价有一定的偏差。这是因为人眼对图像某个区域的感知结果不单单取决于当前区域,在一定程度上取决于该区域的临近区域对人眼的影响。所以不能单单使用 PSNR 来评判图像质量的优劣,需要引入新的图像质量评价概念。
(2)结构相似性 SSIM
结构相似性是一种衡量两幅图像相似度的指标,该指标首先由德州大学奥斯丁分校的图像和视频工程实验室提出,给定两个图像 x 和 y, 则这两张图像的结构相似性可按照如下公式求出:
JPEG-LS 图像压缩算法的结构框图如图所示。如果图像中有大块区域像素灰度比较平滑,则可以通过游程模式进行压缩。具体选择哪种编码模式,是根据上下文信息来确定。
该算法对图像压缩过程中,不需要对图像进行离散余弦变换(DCT)和算数编码等,只进行预测和Golomb-Rice 编码,算法复杂度较低。普通模式下编码步骤为:
a. 求当前像素的上下文参数;
b. 根据上下文模板中的相邻像素值进行预测,得到当前像素的预测值,以上述上下文参数修正预测值;
c. 利用预测值与原像素得到预测误差,对预测误差进行修正编码;
d. 更新上下文的相关参数;
e. 对预测残差进行 Golomb
(1)梯度值计算
利用当前像素相邻的几个像素值来计算得到三个梯度值:
其中,c、b、d、a均使用的是像素的重建值。在无损压缩中,像素的重建值即为像素本身;而在近无损压缩中,像素的重建值和像素往往不同,需要先计算出前一个像素的重建值,然后再进行该点像素的上下文建模。这也是在硬件实现时,无损压缩要比近无损模式更加容易实现的原因。
(2)梯度值量化
根据梯度门限参数T1,T2,T3和量化失真参数Near,将梯度值进行量化,公式如下:
门限参数与量化失真参数Near和像素位宽n有关,其公式如下:
(3)计算上下文索引
得到上下文像素的三个梯度量化值之后,需要根据公式来计算该点的上下文索引:
JPEG-LS 使用边缘检测来对当前像素 x 进行预测,即选取 Ra, Rb, Ra + Rb - Rc三个数中间的一个作为前像素 x 的预测值 Px ,公式如下:
这个过程是基于上下文索引值Q的符号项sign、残差修正值C[Q] 和参数 Maxval(由图像像素精度确定)来修正预测值Px 的。其中 Maxval 取值为图像像素所占比特位数的最大值。通过如下所示方法进行自适应误差修正:
预测残差是图像像素值和其预测值的差值,如下:
sign代表上下文索引Q的符号,Q为负时,sign等于1,否则,sign等于0;
如果是无损压缩模式,则直接对预测残差Errval进行Golomb编码;
如果是近无损压缩模式,还需要对预测残差进行量化和模减;
在近无损压缩模式下,可以通过失真量化参数 near 对预测误差 Errval 进行量化,使预测误差 Errval 的绝对值范围进一步缩小,方便进行编码。近无损压缩模式下,量化误差公式如下:
sign代表上下文索引Q的符号。
预测误差的范围为±(Range-1),其中 Range 为图像中像素最大值加 1 得到,由于图像中像素的表示区间为[0,Range-1],实际上长度为 Range 的区间便可以表示所有的预测误差。所以我们可以通过对预测误差进行模减的方式,将误差折叠到(Integer(RANGE/2),Integer((RANGE+1) /2))范围内,这样可以使误差范围进一步收缩,方便编码。
当预测误差 Errval 小于-RANGE/2,便将预测误差 Errval 加上 RANGE 值。在完成这步处理后,若预测误差 Errval 大于等于(1+RANGE)/2,则需要将预测误差 Errval 减去 RANGE 值。经过处理后,所有预测误差 Errval 的值的绝对值都不会大于(RANGE+1) /2。模减的公式如下:
JPEG-LS 为 每 一 个 上 下 文 环 境 都 相 应 设 置 一 组 上 下 文 参 数A[Q],B[Q],C[Q],N[Q]来保存相应的上下文信息,其中 A[Q]是对量化残差的绝对值的累加器,其作用是估计 Golomb 编码参数 k,B[Q]是对重建残差的累加器,其作用是帮助计算预测偏差 C[Q],C[Q]保存的是对应于该上下文环境的平均预测偏差值,用来修正像素预测值。N[Q]是对应上下文环境的计数器,保存的是该上下文环境出现的次数。
在对图像压缩编码的过程中需要实时更新上下文参数 A[Q],B[Q],N[Q],其中Errval 是指量化模减后的预测误差,Near 是指失真量化参数:
A[Q]=A[Q]+abs(Errval);
B[Q]=B[Q]+Errval*(2*Near+1);
if(N[Q]==RESET){
A[Q]>>=1;B[Q]>>=1;C[Q]>>=1;
}
N[Q]++;
//更新完 B[Q]和 N[Q]后,通过如下方式更新 C[Q]:
if(B[Q]<=-N[Q]){
B[Q]+=N[Q];
if(B[Q]<=-N[Q])
B[Q]=1-N[Q];
C[Q] = C[Q] - (C[Q] > MIN_C);
}
else if(B[Q]>0){
B[Q]-=N[Q];
if(C[Q]<MAX_C) C[Q]++;
if(B[Q]>0) B[Q]=0;
}
每编完一个像素点都要对上下文参数进行更新,这样可以使得上下文参数能够最大程度与当前像素的上下文环境相匹配,提高对当前像素的压缩编码性能。
这个JPEG-LS算法存在两个反馈逻辑环路,这里是第二个,上下文参数组的更新在前后像素之间是具有强依赖关系的;FPGA在实现数据流设计时,上一个像素点的参数来不及在一个时钟周期内,完成读取、更新、存储。因此需要用到多路并行的前向预测电路,打破原有的串行逻辑。具体的实现方式我们在下一篇博客中再进行说明。
Golomb 编码只能对非负整数进行编码,而量化后的预测残差的符号可正可负,近似服从拉普拉斯分布,而几何分布的 Golomb-Rice 编码效果比较理想,故需要对预测残差分布变换为几何分布,进行映射。公式如下:
当编码字符服从几何分布时,使用可以取得最优效果。较大数字出现的概率远小于较小数字,用较短的码长编码较小的数字,较长的码长编码较大的数字。 以正整数 m 为参数,对 n 进行 Golomb 编码,分为两部分:n%m 的二进制码和n/m 的一元码。对几何分布的被编码变量,总存在一个 m 使得编码后的平均码长最短。 当 m 的取值为 2^k时的Golomb 编码叫做 Golomb-Rice 编码。此时,对 n 的编码就可以表示为:(n/2 的一元码表示)加上 n 的低 k 位 。参数 k 的确定:
对于一个给定的参数m,那么一个整数n(n>0)的Golomb码Gm由两部分组成:[n/m]的二元码表示,和n mod m二进制直接表示,中间用一为二进制1来隔开。其中所谓的二元码表示就是指,所要表示的整数值是多少就用多少个0来表示它。例如当参数m取为4,整数n是9时,那么n的Golomb码G4为0011,可见使用Golomb编码可以讲很多数用小于8个bit的位数来表示,因而达到了压缩的效果。
FPGA实现的JPEGLS图像压缩,游程编码模式不易于硬件实现。本项目暂时舍弃这一编码模式。
无损模式不需要反量化。在近无损压缩模式中,通过以下公式,编码器可以得到当前像素 的重建值Rx ,其中 Px为修正预测值,Errval 是量化模减后的预测误差。