绪论

JPEG-LS是在ISO/ITU的新标准中用于对静态连续色调图像进行无损或进无损压缩的一种算法。它不是JPEG的一个简单扩充或修正,是一种新的压缩方法。支持无损和近无损图像压缩,不使用离散余弦变换,也不使用算术编码,仅在近无损压缩模式下有限地使用量化。该算法具有实现复杂度低,保真度高等特点,本文就JPEG-LS的核心算法LOCO-I以及其编码流程进行详细的分析和研究。

1. 压缩算法简介与评估

1.1 压缩算法简介

无损压缩就是指经过压缩并重建后的图像和原图像完全一样,没有任何损失。如果重建图像和原图像存在差距,而误差被限制在一定的范围内就称作近无损压缩。近无损压缩虽然有所损失,但对视觉影像却很小,也可以认为是无损的。有很多无损或近无损的图像压缩算法,例如传统的JPEG无损模式、JPEG-2000等等。

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 无损压缩算法性能要好。

1.2 图像质量评估

(1)码率
在图像压缩领域,图像压缩后的码率是指单位像素编码所需要的编码长度,一般单位为 bpp(Bit Per Pixel)。进行无损压缩时,若在压缩同一位深度的图像时取得的码率越低,则代表压缩性能越好。

(2)峰值信噪比 PSNR
峰值信噪比(PSNR)是评价图像质量的一种较为常见的指标。若要得到一幅重建图像的峰值信噪比的值,需要计算它与原图像之间的均方误差,并作处理后得到。其计算公式如下:

其中H、W、n分别代表两幅图片的高度,宽度和像素位宽。峰值信噪比是评价重建图像质量时比较重要的指标,不过这一指标也存在着诸多局限。一些研究表明,峰值信噪比的数值可能与人眼对于图像的评价有一定的偏差。这是因为人眼对图像某个区域的感知结果不单单取决于当前区域,在一定程度上取决于该区域的临近区域对人眼的影响。所以不能单单使用 PSNR 来评判图像质量的优劣,需要引入新的图像质量评价概念。

(2)结构相似性 SSIM
结构相似性是一种衡量两幅图像相似度的指标,该指标首先由德州大学奥斯丁分校的图像和视频工程实验室提出,给定两个图像 x 和 y, 则这两张图像的结构相似性可按照如下公式求出:

2. JPEGLS压缩算法

JPEG-LS 图像压缩算法的结构框图如图所示。如果图像中有大块区域像素灰度比较平滑,则可以通过游程模式进行压缩。具体选择哪种编码模式,是根据上下文信息来确定。

该算法对图像压缩过程中,不需要对图像进行离散余弦变换(DCT)和算数编码等,只进行预测和Golomb-Rice 编码,算法复杂度较低。普通模式下编码步骤为:
a. 求当前像素的上下文参数;
b. 根据上下文模板中的相邻像素值进行预测,得到当前像素的预测值,以上述上下文参数修正预测值;
c. 利用预测值与原像素得到预测误差,对预测误差进行修正编码;
d. 更新上下文的相关参数;
e. 对预测残差进行 Golomb

2.1 上下文建模

上下文建模其实就是通过该点像素与附近像素的梯度,得到一个索引参数的过程。该索引参数用于该点像素A,B,C,N参数的寻址和更新。上下文建模包括梯度计算、梯度量化和索引值求解三个部分。

(1)梯度值计算
利用当前像素相邻的几个像素值来计算得到三个梯度值:

其中,c、b、d、a均使用的是像素的重建值。在无损压缩中,像素的重建值即为像素本身;而在近无损压缩中,像素的重建值和像素往往不同,需要先计算出前一个像素的重建值,然后再进行该点像素的上下文建模。这也是在硬件实现时,无损压缩要比近无损模式更加容易实现的原因。
(2)梯度值量化
根据梯度门限参数T1,T2,T3和量化失真参数Near,将梯度值进行量化,公式如下:

门限参数与量化失真参数Near和像素位宽n有关,其公式如下:

(3)计算上下文索引
得到上下文像素的三个梯度量化值之后,需要根据公式来计算该点的上下文索引:

2.2 边缘检测

JPEG-LS 使用边缘检测来对当前像素 x 进行预测,即选取 Ra, Rb, Ra + Rb - Rc三个数中间的一个作为前像素 x 的预测值 Px ,公式如下:

2.3 自适应预测修正

这个过程是基于上下文索引值Q的符号项sign、残差修正值C[Q] 和参数 Maxval(由图像像素精度确定)来修正预测值Px 的。其中 Maxval 取值为图像像素所占比特位数的最大值。通过如下所示方法进行自适应误差修正:

2.4 预测残差计算

预测残差是图像像素值和其预测值的差值,如下:

sign代表上下文索引Q的符号,Q为负时,sign等于1,否则,sign等于0;
如果是无损压缩模式,则直接对预测残差Errval进行Golomb编码;
如果是近无损压缩模式,还需要对预测残差进行量化和模减;

2.5 量化和模减

在近无损压缩模式下,可以通过失真量化参数 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。模减的公式如下:

2.6 参数更新

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在实现数据流设计时,上一个像素点的参数来不及在一个时钟周期内,完成读取、更新、存储。因此需要用到多路并行的前向预测电路,打破原有的串行逻辑。具体的实现方式我们在下一篇博客中再进行说明。

2.7 Golomb编码

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图像压缩,游程编码模式不易于硬件实现。本项目暂时舍弃这一编码模式。

2.8 反量化与像素重建

无损模式不需要反量化。在近无损压缩模式中,通过以下公式,编码器可以得到当前像素 的重建值Rx ,其中 Px为修正预测值,Errval 是量化模减后的预测误差。

JPEGLS图像压缩算法的FPGA实现(一)压缩算法相关推荐

  1. sobel算子原理_「学术论文」基于Sobel算法图像边缘检测的FPGA实现

    摘要: 针对嵌入式软件无法满足数字图像实时处理速度问题,提出用硬件加速器的思想,通过FPGA实现Sobel边缘检测算法.通过乒乓操作.并行处理数据和流水线设计,大大提高算法的处理速度.采用模块的硬件设 ...

  2. 基于xilinx FPGA实现LZW压缩算法

    1 LZW算法简介 数据压缩分为有损压缩和无损压缩.有损压缩是对压缩后的数据进行重构 (解压缩 ) ,重构后的数据与原来的数据有所不同,换来了大的压缩比.无损压缩指对压缩后的数据进行重构 ,重构后的数 ...

  3. 基于FPGA实现压缩算法

    1.LZW压缩简介 略,参考原文档 2.LZW压缩原理 略,参考原文档 3.LZW压缩实现难点 FPGA实现LZW算法要解决以下5个问题: 1)字典容量选择 在实现LZW压缩与解压缩算法的时候,需要构 ...

  4. FPGA实现JPEG-LS图像压缩,有损无损可配置,提供工程源码和技术支持

    目录 1.前言 2.JPEG-LS图像压缩理论 3.JPEG-LS图像压缩性能介绍 4.JPEG-LS图像压缩时序介绍 5.JPEG-LS图像压缩输出压缩流 6.工程源码和仿真 7.福利:工程代码的获 ...

  5. 深度学习为图片压缩算法赋能:节省55%带宽

    本文来自图鸭科技团队的投稿,他们用深度学习技术设计.优化图片压缩算法,在保证图像画质的情况下能节省55%带宽.本文将介绍实现方法及测试对比. 随着互联网的发展,人们对高清图片的需求也在不断增加,在保证 ...

  6. java jpeg压缩算法_在创建JPEG时,我可以更改Java的ImageWriter使用的压缩算法吗?

    "Java's ImageWriter's .write() method produces sub-par results for JPEG images (as compared to ...

  7. lz77优化_压缩时间:10种最佳压缩算法

    数据压缩是减少文件大小,同时保留相同或可比较的数据近似值的过程.这是通过消除不必要的数据或重新格式化数据以提高效率来实现的. 压缩数据时,可以使用丢失或无损方法.丢失方法永久擦除数据,而无损保留所有原 ...

  8. RLE行程长度压缩算法

    RLE(Run Length Encoding)行程长度压缩算法(也称游程长度压缩算法),是最早出现.也是最简单的无损数据压缩算法.RLE算法的基本思路是把数据按照线性序列分成两种情况:一种是连续的重 ...

  9. 【算法】深入了解数据压缩算法(无损压缩和有损压缩)

    目录 1 引言: 1 数据压缩的重要性和应用场景 2 压缩算法的基本原理和分类 2. 无损压缩算法 2.1 哈夫曼编码 2.1.1 哈夫曼编码的原理和步骤 2.1.2 实现一个简单的哈夫曼编码器 2. ...

最新文章

  1. percona mysql安装_mysql 安装 (percona)
  2. iOS抓取日志方式(2)
  3. msclass 文字滚动_文字无缝循环滚动(标题向上滚动)
  4. async/await 的基本实现和 .NET Core 2.1 中相关性能提升
  5. VUE—从入门到飞起(四)
  6. 操作系统原理:全局页面置换算法、工作集页置换、常驻集页置换、抖动问题
  7. unable to access ‘https://github.com/***.git‘: OpenSSL SSL_read: Connection was reset, errno 10054
  8. Allegro 光绘文件快速导入
  9. 池化层:最大池化MaxPool、平均池化AvgPool、自适应池化AdaptiveMaxPool区别--基于pytorch框架
  10. 如何按 value 对 dictionary 进行排序?
  11. c语言 字体点阵取模,[汉字取模软件怎么用]单片机点阵汉字显示需要用
  12. poj 1511 Invitation Cards spfa 基础题!!虽然我做的比较坎坷!!可以练手啊!!
  13. Dos - 学习总结(1)
  14. mac上好用的压缩_Mac图片压缩工具(早晚用到,建议收藏)
  15. 墨画子卿第二章第8节:阿姐?
  16. java - 数据库账号的加密解密
  17. IM即时通讯源码 聊天交友APP源码
  18. 数学与泛型编程(6)编程的基本概念
  19. 关于利率的c语言程序,【c语言】储蓄利息的计算
  20. 502 解决:[WARNING] fpm_children_bury

热门文章

  1. HBuilder输入变成繁体处理方法
  2. CBWFQ/WFQ的对比
  3. 【安信可ESP-12K模组】
  4. java画蝴蝶_怎样用java语言编写蝴蝶结
  5. 【UDK官方教程】知识点学习第一章
  6. 腾讯财经 财经资讯 专题栏目 商业人生
  7. 简易DIV垂直居中阴影层笼罩JS实现
  8. 3.Unity中c#代码学习(按键+屏幕和三维坐标转换+组件的调用)
  9. ipv6地址概述——了解ipv6地址
  10. win10 通过设置加快电脑网速