LV01-图像-03-图片格式-03-01-JPEG基础

本文主要是图片格式——JPEG基础的相关笔记,若笔记中有错误或者不合适的地方,欢迎批评指正😃。

点击查看使用工具及版本
PC端开发环境 Windows Windows11
Ubuntu Ubuntu20.04.6的64位版本
VMware® Workstation 17 Pro 17.0.0 build-20800274
终端软件 MobaXterm(Professional Edition v23.0 Build 5042 (license))
Win32DiskImager Win32DiskImager v1.0
Linux开发板环境 Linux开发板 正点原子 i.MX6ULL Linux 阿尔法开发板
uboot NXP官方提供的uboot,NXP提供的版本为uboot-imx-rel_imx_4.1.15_2.1.0_ga(使用的uboot版本为U-Boot 2016.03)
linux内核 linux-4.15(NXP官方提供)
点击查看本文参考资料
  • 通用
参考资料 相关链接
JPEG官网?jpeg.org
点击查看相关文件下载
------

一、先做一个对比

上一节学习BMP图片格式的时候,做了这样一张BMP图:

format-30x13

这个图片文件有1250个字节,我们使用画图工具另存一下,看看生成其他格式的图片会是怎样的:

image-20240711074015102

可以看到生成其他格式之后,文件的体积都有不同程度的减小,这一节就来学习一下我们经常看到的JPEG文件吧。

二、JPEG格式介绍

1. 维基百科的简介

JPEG 或称 JPG,是一种针对相片影像而广泛使用的失真压缩标准方法,由联合图像专家小组(英语:Joint Photographic Experts Group)开发。此团队创立于1986年,1992年发布了JPEG的标准而在1994年获得了ISO 10918-1的认定。JPEG与视讯音讯压缩标准的MPEG(Moving Picture Experts Group)很容易混淆,但两者是不同的组织及标准。

JPEG本身只有描述如何将一个影像转换为字节的数据串流(streaming),但并没有说明这些位元组如何在任何特定的储存媒体上受封存起来。JPEG的压缩方式通常是有损压缩,即在压缩过程中图像的品质会遭受到可见的破坏,有一种以JPEG为基础的标准Lossless JPEG是采用无失真的压缩方式,但Lossless JPEG并没有受到广泛的支援。

一个由C-Cube Microsystems等公司所建立的额外标准,称为JFIFJPEG File Interchange Format,JPEG档案交换格式,联合图像专家小组档案交换格式)详细说明如何从一个JPEG串流,产出一个适合于电脑储存和传输(像是在网际网路上)的档案。在普遍的用法,当有人称呼一个”JPEG档案”,一般而言他是意指一个JFIF档案,或有时候是一个Exif JPEG档案。然而,也有其他以JPEG为基础的档案格式,像是JNG

使用JPEG格式压缩的图片档案一般也称为JPEG Files,最普遍使用的副档名格式为.jpg,其他常用的副档名还包括.JPEG、.jpe、.jfif以及.jif。JPEG格式的资料也能受嵌进其他类型的档案格式中,像是TIFF类型的档案格式。

JPEG/JFIF是全球资讯网上最普遍的用来储存和传输照片的格式。它并适合于线条绘图(drawing)和其他文字或图示(iconic)的图形,因为它的压缩方法用在这些类型的图形上,得到的结果并不好(PNGGIF通常是用来存储这类的图形;GIF每个像素只有8位元,并不很适合于存储彩色照片,PNG可以无失真地储存照片,但是档案太大的缺点让它不太适合在网路上传输)。

对于JFIF的MIME媒体类型是image/JPEG(定义于RFC 1341)。

2. 后缀名?

前面已经说过了,JPEG(Joint Photographic Experts Group)是JPEG标准的产物,该标准由国际标准化组织(ISO)制订,是面向连续色调静止图像的一种压缩标准,是24位的图像文件格式。JPEG格式是最常用的图像文件格式,后缀名通常为.jpg.jpeg

3. 三种格式

JPEG格式可以分为标准JPEG、渐进式JPEG和JPEG2000三种格式。其中标准JPEG和渐进式JPEG均为有损压缩。

  • 标准JPEG

只有图片完全被加载和读取完毕之后,才能看到图片的全貌;它是一种很灵活的图片压缩方式,用户可以在压缩比和图片品质之间进行权衡。不过,通常来讲,其压缩比在10:1到40:1之间,压缩比越大,品质就越差,压缩比越小,品质就越好。JPEG格式压缩的主要是高频信息,对色彩的信息保留较好,适合应用于互联网,可减少图像的传输时间,可以支持24bit真彩色,也普遍应用于需要连续色调的图像。JPEG由于可以提供有损压缩,因此压缩比可以达到其他传统压缩算法无法比拟的程度。其压缩模式有以下几种:顺序式编码(SequentialEncoding),递增式编码(ProgressiveEncoding),无失真编码(LosslessEncoding)和阶梯式编码(HierarchicalEncoding)。

  • 渐进式JPEG

此类型在网页下载时,先呈现出图像的粗略外观后,再慢慢地呈现出具体细节的内容,而且存成渐进式JPG格式的文档比存成标准JPG格式的文档要来得小,所以如果要在网页上使用图像,可以多用这种格式。

  • JPEG2000

它是新一代的影像压缩法,压缩品质更高,并可改善在无线传输时,常因信号不稳造成马赛克现象及位置错乱的情况,改善传输的品质。另外,作为JPEG的升级版,JPEG2000的压缩率比标准JPEG高约30%,同时支持有损压缩和无损压缩。它还支持渐进式传输,即先传输图片的粗略轮廓,然后,逐步传输细节数据,使得图片由模糊到清晰逐步显示。

说明:它使用了与标准的JPEG完全不同的技术

1、使用小波变换代替DCT变换,避免了分块导致的马赛克模糊

2、采用自适应算术编码

3、支持无损压缩存储

4、支持渐进式传输和显示

5、支持ROI

6、压缩率相比JPEG更高

三、JPEG编码

JPEG 压缩是有损压缩,但这个损失的部分是人的视觉不容易察觉到的部分,它充分利用了人眼对计算机色彩中的高频信息部分不敏感的特点,来大大节省了需要处理的数据信息。

人眼对构成图像的不同频率成分具有不同的敏感度,这个是由人眼的视觉生理特性所决定的。如人的眼睛含有对亮度敏感的柱状细胞1.8亿个,含有对色彩敏感的椎状细胞0.08亿个,由于柱状细胞的数量远大于椎状细胞,所以眼睛对亮度的敏感程度要大于对色彩的敏感程度。

总体来说,一个原始图像信息,要对其进行 JPEG 编码,过程分两大步:

  • (1)去除视觉上的多余信息,即空间冗余度。

  • (2)去除数据本身的多余信息,即结构(静态)冗余度。

1. 去除视觉上的多余信息

当我们拿到一个原始未经处理的图像,是由各种色彩组成的,即在一个平面上,有各种色彩,而这个平面是由水平和垂直方向上的很多点组成的。实际上,每个点的色彩,也即计算机能表示的每个像素点的色彩,能分解成红、绿、蓝,即 RGB 三元色来表示,即这三种颜色的一定比例的混合就能得到一个实际的色彩值。

img

所以,实际上,这个平面的图像,可以理解为除了水平 X 和垂直 Y 以外,还有一个色彩值的 Z 的三维的系统。Z 代表了三元色中各个分支 R/G/B 的混合时所占的具体数值大小,每个像素的 RGB 的混合值可能都有所不同,各个值有大有小,但临近的两个点的 R/G/B 三个值会比较接近。

img

由于这个原始图像是由很多个独立的像素点组成的,也就是说它们都是分散的,离散的。比如有些图像的尺寸为640X480,就表示水平有640个像素点,垂直有480个像素点。

从上面的内容,我们可以知道两个相邻的点,会有很多的色彩是很接近的,那么如何能在最后得到的图片中,尽量少得记录这些不需要的数据,也即达到了压缩的效果。这个就要涉及到图像信号的频谱特性了。

图像信号的频谱线一般在0-6MHz范围内,而且一幅图像内,包含了各种频率的分量。但包含的大多数为低频频谱线,只在占图像区域比例很低的图像边缘的信号中才含有高频的谱线。这个是对 JPEG 图像压缩的理论依据。

因此具体的方法就是,在对图像做数字处理时,可根据频谱因素分配比特数:对包含信息量大的低频谱区域分配较多的比特数,对包含信息量低的高频谱区域分配较少的比特数,而图像质量并没有可察觉的损伤,达到数据压缩的目的。

将原始图像这个色彩空间域,转换为频谱域,怎么转呢?这个就用到了数学上的离散余弦变换,即 DCT(Discrete Cosine Transform) 变换

DCT 是可逆的、离散的正交变换。变换过程本身虽然并不产生压缩作用,但是变换后的频率系数却非常有利于码率压缩。即这个变换过程得到一个 DCT 变换系数,而对这个系数可以再进行更进一步的处理,即所谓的量化。经过量化,就能达到数据压缩的作用了。

总体说来,这第一步,对图像进行编码,去除多余的信息,要用到 DCT 变换中的正向 DCT(FDCT),然后再对变换的系数做量化(Quantization),这个过程就是依据的经验值,来处理人眼视觉系统所不敏感的高频数据,从而极大地减少了需要处理的数据量,这个是结合数学方法与经验值而做的处理。

2. 去除数据本身的多余信息

利用 Huffman 编码,来将最后的数据用无损的方式做压缩,这个是纯数学上的处理方式。

3. 总结

总体来说,上面的两步即:

如果处理的是彩色图像,JPEG 算法首先将 RGB 分量转化成亮度分量和色差分量,同时丢失一半的色彩信息(空间分辨率减半)。然后,用 DCT 来进行块变换编码,舍弃高频的系数,并对余下的系数进行量化以进一步减小数据量。最后,使用 RLE 行程编码和 Huffman 编码来完成压缩任务。