音视频编解码—JPEG3 Baseline流程介绍

上一篇讲解了jpeg的基本调用逻辑,但是有朋友私信说其中几个概念不太理解,所以本文做一下说明:

base line JPEG

JPEG 有许多指定版本,JPEG base line 压缩仅包含一组最低要求:是有损的,无法准确重建原始图像

Baseline(“标准”)使用大多数网络浏览器都能识别的格式。Baseline优化创建具有优化颜色和稍小文件大小的文件。

Progressive 在下载时显示一系列越来越详细的图像版本(您指定数量)。(并非所有网络浏览器都支持优化和渐进式 JPEG 图像。)”当然选择不同的版本,择压缩对应的算法就不太一样,所对应的SOF也有差别,如下图所示:

图片

在标准也有对应的体现:

图片

但是实际使用过程中,我们一般是baseline JPEG和Progressive JPEG两个主要版本:

使用基线 JPEG,用户将首先看到图像的顶部,然后是另一部分,依此类推,直到下载完整个图像。JPEG Baseline (Process 1): Default Transfer Syntax for Lossy JPEG 8-bit Image Compression 基本就是8bit的压缩,

图片

Progressive JPEG版本的工作方式不同:它显示图像的模糊预览,然后逐渐增加细节级别,直到图像达到其原始质量。这是它的样子:

图片

这种情况下用户可以立即看到物体的轮廓,然后图片在加载时变得更加清晰。

当加载过程达到 50% 时,用户将清楚地看到图像,几乎没有明显的失真,而基线 JPEG 在 50% 时只显示一半的图片。

data_precision

“位”是计算机将信息存储为 1 或 0 的方式。一个位对于“是”或“否”之外的任何事情都没有真正的好处,因为它只能有 2 个值。如果它是一个像素,它将是纯黑色或纯白色。

“位深度”决定了您可以相对于某个值范围进行的最小更改。如果我们的比例是从纯黑到纯白的亮度,那么我们从一个 2 位数字得到的 4 个值将包括:黑色、深色中间调、浅色中间调和白色。这是一个非常粗糙的比例,对照片不是很有用。但是,如果我们有足够的位,我们就有足够的灰度值来制作从黑色到白色的完美平滑渐变。

这是一个比较不同位深度下的黑色到白色渐变的示例。此处嵌入的图像只是一个示例,单击此处可查看位深度高达 14 位的 JPEG2000 格式的全分辨率图像。根据显示器的质量,您可能最多只能显示 8-10 位的差异。

    *JPEG 8位:这是最常见的JPEG方式,每个像素使用8位。这允许图像中表示256种颜色或灰度。JPEG 8位适用于大多数标准照片和图形。

    *JPEG 12位:这种JPEG方式使用12位每像素,这允许图像中表示4,096种不同的颜色或灰度级别。这种更高的位深度在科学和医学成像中很有用,需要更准确的颜色或灰度表示。

    *JPEG 16位:这种JPEG方式使用16位每像素,这允许图像中表示65,536种不同的颜色或灰度级别。这种更高的位深度通常用于卫星图像、X射线成像和其他科学成像应用中,这些应用需要极高的细节和颜色准确度。

图片

特别备注

JPEG库中有大量的Define,用来连接到具体实现,例如下图:

图片

颜色量化

JPEG 采用了两种不同的颜色量化过程:一次粗略的量化过程和一次更细致的量化过程。这两个过程被称为“一次扫描”和“二次扫描”,也被称为“粗略量化”和“细化量化”。

以下是 JPEG 的两次颜色量化过程的简要说明:

一次扫描(粗略量化):

在一次扫描期间,JPEG 首先将 RGB 颜色空间中的图像转换为 YCbCr 颜色空间。然后,它将色度信号 Cb 和 Cr(也称为“色差”信号)进行下采样(降低分辨率)以减少图像数据量。接下来,它对每个 8×8 的图像块执行离散余弦变换(DCT)以将空间域数据转换为频域数据。最后,JPEG 对每个 8×8 块进行颜色量化,该量化将每个块中的每个颜色值舍入到最接近的量化级别,以减少颜色数据量。

二次扫描(细化量化):

在二次扫描期间,JPEG 采用了更为细致的颜色量化过程。该过程使用第一次扫描的结果作为基础,并对每个块的量化级别进行微调,以更好地适应图像中的颜色变化。这个过程中需要对每个块中的每个颜色值进行重新量化,并将其舍入到新的量化级别。二次扫描过程可以通过使用更高的量化表来实现,或者通过对第一次扫描中的量化表进行微调来实现。

综上所述,JPEG 的两次颜色量化过程都是为了减少图像数据量和提高压缩比。一次扫描提供了初步的颜色量化结果,而二次扫描进一步微调了量化级别以提高压缩效果。

更加详细的说明,可以参考如下文章:http://www.leptonica.org/color-quantization.html

DTC量化表

图片

Baseline核心流程

那Baseline具体是如何实现的呢?我们跟踪一下关键点:

main函数传参时候就是按照8bit进行,所以sample肯定是baseline了,同时,量化参数是75,为之后做准备。

图片

jpeg_set_defaults中初始化一些默认值,可以看出,scan info 为空,num_scans为0,arith_code为false,optimize_coding为false,这些值都会影响流程的走向。

图片

jpeg_set_linear_quality中设置量化表:依据main中设置的75量化因子,以及和量化表中参数乘积,同时受限于8bit的封顶最大值仅为255。

图片

jinit_compress_master -> jinit_c_master_control

图片
图片

颜色空间转换

色彩空间转换是将输入图像从RGB色彩空间转换为YCbCr色彩空间,这是JPEG压缩算法所采用的色彩空间。在这个过程中,对于8位输入图像,可以使用不同的量化矩阵进行加权。由于人眼对于颜色的感知与亮度的感知有所不同,因此使用YCbCr色彩空间能够使得JPEG压缩算法更加高效。

颜色空间转化相关代码可以参考:libjpeg-turbo-mainjccolor.c,

图片

支持的颜色空间转换包括:grayscale_convert,rgb_gray_convert,rgb_rgb_convert,rgb_ycc_convert,cmyk_ycck_convert

分块和DCT变换

分块和DCT变换是将输入图像分成多个8×8的块,并对每个块进行离散余弦变换(DCT)。DCT变换能够将8×8块中的像素数据转换为一组DCT系数,这些系数包含了该块的频域信息。在这个过程中,可以对每个块使用不同的量化矩阵进行加权,从而在一定程度上影响压缩效果。

图片

量化和熵编码(quantization and entropy coding)

量化是将DCT系数进行量化,将高频信息的量化步长增大,从而降低高频信息的精度,以达到压缩数据的目的。在这个过程中,可以使用不同的量化矩阵进行加权。熵编码是将量化后的系数进行编码,以减少压缩后的数据量。这个过程中使用了霍夫曼编码(Huffman coding)和游程编码(run-length encoding)等技术,将出现概率高的系数用较短的编码表示,从而进一步减小压缩后的数据量。

图片

文件写入(file output)

文件写入是将压缩后的数据写入文件,以便于存储和传输。在这个过程中,使用了JPEG标准定义的文件格式,其中包括了图像的宽度、高度、颜色空间信息、量化等信息。

图片
图片

至此,JPEG的核心内容讲解差不多了,其他内容就需要个人review代码,以调试过程中碰到的问题了,这个需要经验积累,逐步精进。

作者:MediaStack。我是一枚爱跑步的程序猿,维护公众号和知乎专栏《MediaStack》,有兴趣可以关注,一起学习音视频知识,时不时分享实战经验。

版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。

(0)

相关推荐

发表回复

登录后才能评论