【数字图像处理2】编码、压缩



2024年03月02日    Author:Guofei

文章归类: 0x25_CV    文章编号: 1014

版权声明:本文作者是郭飞。转载随意,标明原文链接即可。本人邮箱
原文链接:https://www.guofei.site/2024/03/02/digital_image_spatial2.html


图片格式

准备知识

  1. 压缩方法:有损vs无损
  2. 索引色vs直接色
    • 索引色是存储一个索引,然后点阵用索引来表示。
    • 直接色。用数字来表示颜色,例如 RGBA
  3. 点阵图vs矢量图
格式 特点 简评
BMP(BitMap) 无损,支持索引色和直接色,点阵图 古老格式。无压缩,通常很大
GIF(Graphics Interchange Format) 无损、索引色、点阵图 用 LZW 压缩算法。仅支持8bit的索引色,也就是说整个图片只能有 256 种颜色。适用于对色彩要求不高同时需要文件体积较小的场景,比如企业Logo、线框类的图等。还支持动图。
JPEG 有损、直接色、点阵图 设计目标是在不影响人类可分辨的图片质量的前提下,尽可能的压缩文件大小。用直接色所以色彩丰富,适合存储照片。与GIF相比,不适合用来存储企业Logo、线框类的图。因为有损压缩会导致图片模糊,而直接色又会导致图片文件较GIF更大。
PNG-8(Portable Network Graphics) 无损、索引色、点阵图 最多 256 种颜色,尽可能使用PNG-8而不是GIF,它体积更小,还支持透明度的调节。PNG 都使用了 DEFLATE 压缩算法
PNG-24 无损,直接色,点阵图 是PNG的直接色版本。RGB 的 3 通道各用8bit来存储
PNG-32 无损、直接色、点阵图 RGBA 的 4 通道各用8bit来存储
SVG(Scalable Vector Graphics) 无损、矢量图 使用XML来描述图片
WebP 支持有损和无损压缩的、直接色、点阵图 谷歌开发,目标是相同精度下尽量降低体积
tiff   一般用于印刷图片,平面设计可以保存格式并发送给制作部门制作实物,图片也一般较大
RAW   存储相机传感器捕获的未经处理的数据,体积很大。可以无限次调整曝光、色温、白平衡而不降低图像质量。无需担心像 JPEG 那样每次编辑都降低质量

视频格式

格式 特点 其它
.avi 图像质量好,体积庞大 微软开发。压缩标准不统一,时常会出现由于视频编码问题
MPEG(.MPG .MPEG .MPE .DAT .VOB .ASF .3GP .MP4 使用最少的数据获得最佳的图像质量 英文全称为Moving Picture Experts Group
Real Video .RM .RMVB 400-500kbps码率下还有很不错的清晰度  
flv 比RMVB更优秀  
.MOV 美国Apple公司开发的一种视频格式,默认的播放器是苹果的QuickTime QuickTime File Format
WMV .WMV .ASF 本地或网络回放,丰富的流间关系以及扩展性等。需要在网站上播放,需要安装Windows Media Player,很不方便,现在已经几乎没有网站采用了。 微软,Windows Media Video
Matroska .MKV 是一种新的多媒体封装格式,这个封装格式可把多种不同编码的视频及16条或以上不同格式的音频和语言不同的字幕封装到一个Matroska Media档内。它也是其中一种开放源代码的多媒体封装格式。Matroska同时还可以提供非常好的交互功能,而且比MPEG的方便、强大。  

总结:

  • MKV是比较先进的。
  • H.264.现在常用。H.265 压缩率更好

指标

  • 码率(Mbps)*时间(秒)/8=文件大小(MB)
  • 1080p的:视频码率过一万,分辨率1920x1080,文件大小10g+
  • 720的:视频码率大概是3000~4000,分率1280x720,文件大小5g左右 在线点播网站顶多只能算伪高清,只有分辨率达到标准,码率只有2000左右。对高清发烧友而言,这是无法忍受的。

JPEG 压缩算法

有这几个步骤:

  1. 颜色空间转换。RGB 转 YCbCr
    • Y分量表示亮度(明亮程度),而Cb和Cr分量则表示色度(颜色信息)。
    • 原理:人眼对亮度变化更敏感,因此可以对亮度和颜色做不同程度的压缩。
  2. 下采样(Subsampling)
    • 最常见的4:2:0,在每个 2x2 区域上,保留 4 个 Y 值,1 个平均后的 Cb 值,1 个平均后的 Cr 值
    • 4:2:2,水平的 2x1 区域上,保留 2 个 Y 值,1 个平均后的 Cb 值,1 个平均后的 Cr 值
    • 4:4:4,不做下采样,所有值都保留
  3. 分块。将图像划分为 8×8 的像素块。
  4. 离散余弦变换(DCT):对每个 8x8 块进行DCT变换。
    • 原理:人眼对高频信息敏感度小于低频信息
    • DCT将空间域(像素值)转换为频率域,大多数高频信息会被压缩,而低频信息则会被重点保留。
    • 8x8 的区域 DCT 后,生成一个 8x8 的实数矩阵
  5. 量化(Quantization)
    • 关键的有损步骤,极大提高压缩程度。
    • 使用量化表对 DCT 系数进行量化。量化表是一个预先定义的矩阵,其中每个元素对应于 DCT 系数的一个缩放因子。
    • 将 DCT 系数除以量化表中的相应元素,然后四舍五入为整数,减少系数的精度,从而实现压缩。量化表的设计通常根据人类视觉系统的特性进行,对低频系数采用较小的量化步长,对高频系数采用较大的量化步长。
    • 合理选择量化表,可以在压缩比和图像质量之间进行平衡。
    • 看起来量化过程把一个 8x8 矩阵映射到另一个 8x8 矩阵,那么这过程中如何压缩数据的?
      • 高频区域对应的系数更可能压缩到接近0,从而变成 0,这样系数矩阵变得更加稀疏,在下一步能很好的压缩;而其它区域产生的结果,也是几十以内的整数,可以用较少的位表示;
  6. 熵编码(Entropy Coding):对量化后的DCT系数进行熵编码,通常使用哈夫曼编码来进一步压缩数据。熵编码可以根据符号出现的频率对数据进行编码,从而实现有效压缩。
    • 图像较大时,确定 Huffman 树消耗计算资源较多,因此往往预先规定一个 Huffman 编码表
  7. 生成JPEG文件:上述处理后的数据,添加元信息、压缩信息,输出为图片文件

而解压过程则是以上步骤倒过来

名词解释

  • 高频区域:细节、噪声
  • 低频区域:图像的大面积的均匀区域、缓慢变化的色调以及物体的大致轮廓等。例如:一幅蓝天白云的照片中,广阔的蓝天部分颜色变化相对缓慢,这就是低频信息的体现。天空的整体色调较为一致,没有剧烈的色彩或亮度变化。一个人物肖像照片中,人物的脸部大面积的肤色区域通常也属于低频信息,因为肤色在局部范围内的变化相对较小。

jpeg算法

其他压缩理论

考虑使用 720✖️480✖️24 比特像素阵列描绘 1小时的电影,其大小是:(30帧/秒)✖️(720✖️480 像素/帧)✖️(3字节/像素)✖️(3600秒/小时)✖️(2小时)≈200GB

这肯定是不能接受的。

对冗余做分类

  • 编码冗余。例如,颜色出现的次数不一样,但都用8位bit
    • 解决方案:变长编码(一个例子是 Huffman 编码)
  • 空间和时间冗余。例如,灰度图很多像素和相邻像素是一样的,因此没必要重复。视频里相邻帧的像素也很可能是一样的。
  • 不相关信息。例如,包含一些人类视觉系统无法感知的,或者用途无关的信息。

一些常用方法

  • Huffman 编码
  • Golomb 编码。用于对非负整数的编码。如果被表示的整数服从集合分布,压缩效果最好。
  • LZW 编码
    • 利用了空间结构,因此往往比 Huffman 压缩率更高。
    • LZW 编码先生成一个字典,然后把某些连续的像素映射到字典上。
    • 例如,采用9比特字典(也就是字典容量512个),然后把“连续两个白色像素”映射到某个表示(例如256)。如果图像中有很多“连续两个白色像素”,那么就达到了很好的压缩效果。
    • 另外,0~255这256个,仍然分配给原本的0~255灰度级。

行程编码。编码模式中,用两个字节 RLE 表示,

  • 第一个字节表示连续像素的数目。0表示一行的末尾或整个图像的末尾。
  • 第二个字节表示颜色索引。如果是8比特,表示256色。

行程编码绝对值模式

  • 第一个字节是0
  • 第二个字节通知4种可能的条件
    • 第二个字节是0,表示一行的末尾
    • 第二个字节是1,表示一幅图的末尾
    • 第二个字节是2,则下两个字节是水平偏移和垂直偏移
    • 第二个字节是3~255之间,指定非压缩像素的数量

您的支持将鼓励我继续创作!