**图像压缩**是数据压缩技术在数字图像上的应用，目的是减少图像数据中的冗余信息，从而用更加高效的格式存储和传输数据。

壓縮的原理
-----

資料越一致，代表統計特性越集中，包括傅立葉轉換域(Fourier transform domain)、直方圖(histogram)、特徵值(eigenvalue)......等方面的集中度。壓縮的通則即是利用資料的**一致性**，越一致的資料，越能夠進行壓縮。除此之外，也可利用資料的規則性與可預測性來對其作壓縮。通常而言，若可以用比較**精簡的自然語言**來描述一個東西，那麼也就越能夠對這個東西作壓縮。

### 利用資料的特性作壓縮

* 文章：常用字或字母(字母多出現E，少出現QXZ)。
* 歌曲：重複的旋律、頻率的倍頻關係、節拍內頻率的穩定。
* 聲音：能量多集中在低頻、頻率在短區間內的穩定。
* 卡通：每塊區域的邊緣(edge)資訊與顏色(color)、邊緣(edge)資訊可以用較少參數編碼(如果邊緣(edge)是幾何圖案)。

### 資料壓縮範例

* 聲音：MP3(.mp3)，壓縮率約1/3。
* 圖片：JPEG(.jpg)，壓縮率約1/10(灰階)或1/20(彩色，利用4：2：0)。
* 影片：MPEG(H.264、H.265)，壓縮率約1/30(灰階)或1/60(彩色)。

影像的一致性
------

### 空間上的一致性

影像中每一點的值，會和相鄰的點的值非常接近。

{\displaystyle \operatorname {F} [m,n+1]\,\!} ≈ {\displaystyle \operatorname {F} [m,n]\,\!}

{\displaystyle \operatorname {F} [m+1,n]\,\!} ≈ {\displaystyle \operatorname {F} [m,n]\,\!}

直方圖(histogram)是統計出現次數的一種方法，它會去計算一個向量(vector)或一個矩陣(matrix)當中，有多少個點會等於某一個值。

舉例來說，{\displaystyle \operatorname {x} [n]=[1,2,3,4,4,5,5,3,5,5,4]\,\!}

則 {\displaystyle \operatorname {x} [n]\,\!}的直方圖(histogram)為
{\displaystyle \operatorname {h} [1]=1\,\!}，{\displaystyle \operatorname {h} [2]=1\,\!}，{\displaystyle \operatorname {h} [3]=2\,\!}，{\displaystyle \operatorname {h} [4]=3\,\!}，{\displaystyle \operatorname {h} [5]=4\,\!}

將影像相臨值的差異，利用直方圖(histogram)來統計，會發現值幾乎都落在0附近。

### 頻率上的一致性

一張影像的頻譜大多集中在**低頻**的地方。
影像的「頻率」是在空間域(space domain)作分析：

* **低頻成分**代表變化較為緩和的地方，對應的是影像的**「顏色」(color)**和**「強度」(intensity)**。
* **高頻成分**代表變化較為劇烈的地方，對應的是影像的**「邊緣」(edge)**和**「雜訊」(noise)**。

常用影像壓縮技術
--------

壓縮的技術分成兩種：**失真壓縮(lossy compression)**的壓縮率較高，但無法重建原來的資料，例如：DFT、DCT、KLT(搭配量化(quantization)與截斷(truncation))、4：2：2或4：2：0、多項式曲線的近似(polynomial approximation)；**無失真壓縮(lossless compression)**的壓縮率較低，但可以重建原來的資料，例如：二元編碼(binary coding)、霍夫曼編碼(Huffman coding)、算術編碼(arithmetic coding)、格倫布編碼 (Golomb coding)。

### 4：2：2或4：2：0

此技術運用的是**空間上的一致性**。

將像素(pixel)的RGB值，利用以下的公式轉換成YCbCr

Y = 0.299 R + 0.578 G + 0.114 B

Cb = -0.169 R - 0.331 G + 0.500 B ( Cb = 0.565 (B - Y) )

Cr = 0.500 R - 0.419 G - 0.081 B ( Cr = 0.713 (R - Y) )

其中 Y 是亮度(Luminance)，Cb是藍色色差(chrominance) ，Cr 是紅色色差(chrominance)。 

人類的視覺系統，對於亮度比較敏感，而對於彩度比較不敏感。
因此我們可以利用人類視覺的特性，減少Cb、Cr的取樣個數，取樣格式有4：2：2 與 4：2：0兩種。

假設一張圖片原本壓縮前(即4：4：4)的Y、Cb、Cr各有M×N個值，4：2：2的壓縮Y保留為M×N個值、Cb、Cr則取樣到各剩下M/2×N個值；4：2：0的壓縮Y同樣保留為M×N個值、Cb、Cr則進一步取樣到各剩下M/2×N/2個值。
從4：4：4到4：2：2，壓縮率約為2/3；從4：4：4到4：2：0，壓縮率約為1/2。
從4：4：4壓縮到4：2：2，再壓縮到4：2：0，單一像素(pixel)儲存的bit 數可以等效為：24 bits/pixel → 16 bits/pixel → 12 bits/pixel。

還原時，則是利用插值(interpolation)的方式：

{\displaystyle \operatorname {C\_{\text{b}}} [2m+1,2n]\,\!} = 1/2 ×({\displaystyle \operatorname {C\_{\text{b}}} [2m,2n]\,\!} + {\displaystyle \operatorname {C\_{\text{b}}} [2m+2,2n]\,\!} )

  

### 8×8 離散餘弦轉換(DCT)

此技術運用的是**頻率上的一致性**。

通常我們會將影像切成8×8的方格作離散餘弦轉換(DCT)，原因如下：

* 一張影像的每個區塊，其高低頻成分都不一樣，對整張影像直接作離散餘弦轉換(DCT)，多少會有高頻成分的出現。如果切成8×8的方格，則對大部分的方格幾乎都沒有高頻成分。
* 降低記憶體的需要量
* 降低運算量

經過離散餘弦轉換(DCT)後的8×8矩陣稱為DCT矩陣。DCT矩陣最左上角的係數稱為**直流(DC)成分**，而其他63個係數則稱為**交流(AC)成分**。越靠近DC值的AC值係數表示頻率較低的部分，而越往右下角方向的AC值代表的頻率則越高。

2D的8×8 DCT的輸出通常會按照"zigzag"的順序，將2D轉為1D的型態。按照此順序排列，能量可能較大的會被擺在前面，而後面的高頻成分從某個值開始後幾乎為零，以符號EOB(end of block)表示，指後面的高頻的部分經過量化(quantization)之後皆為0。

### 差分編碼(Differential coding)

此技術運用的是**空間上的一致性**。

差分編碼指的是，除第一個元素外，將其中各元素都表示為各該元素與其前一元素的差的編碼。

對{\displaystyle \operatorname {DC} [i,j]\,\!} ，是針對 {\displaystyle \operatorname {DC} [i,j]\,\!} - {\displaystyle \operatorname {DC} [i,j-1]\,\!} 去編碼，
而不是直接對{\displaystyle \operatorname {DC} [i,j]\,\!}作編碼。

### 霍夫曼編碼(Huffman coding)

霍夫曼編碼(Huffman coding)的編碼原則：(Greedy Algorithm)

* 所有的碼皆在編碼樹(coding tree)的端點，再下去沒有分枝。滿足**唯一可解譯碼(uniquely decodable code)**與**即時可解碼(instantaneous decodable code)**。
* 機率越大的，編碼長度(code length)越短；機率越小的，編碼長度(code length)越長。
* 假設 {\displaystyle S\_{\text{a}}\,\!} 是第L層的節點(node)，{\displaystyle S\_{\text{b}}\,\!} 是第L+1層的節點(node)，則 {\displaystyle \operatorname {P} (S\_{\text{a}})\,\!} >= {\displaystyle \operatorname {P} (S\_{\text{b}})\,\!} 必須滿足。

不滿足以上的條件則往上推一層。

### 算術編碼(Arithmetic coding)

霍夫曼編碼(Huffman coding)是將每一筆資料分開編碼，算術編碼(Arithmetic coding)則是將**多筆資料一起編碼**，因此壓縮效率比霍夫曼編碼(Huffman coding)更高，近年來的壓縮資料大多使用算術編碼(Arithmetic coding)。

* 範例：

假設要對X來作二進位的編碼，且經過事先的估計，{\displaystyle \operatorname {X} [i]=a\,\!} 的機率為0.8，{\displaystyle \operatorname {X} [i]=b\,\!} 的機率為0.2。

若實際上輸入的資料為 **解析失败 (SVG（MathML可通过浏览器插件启用）：从服务器"http://localhost:6011/zh.wikipedia.org/v1/"返回无效的响应（"Math extension cannot connect to Restbase."）：): {\displaystyle \operatorname{X}= aaabaa \,\!}**

Initial({\displaystyle \operatorname {X} [1]=a\,\!})：lower =0，upper=0.8

When i = 2 ({\displaystyle \operatorname {X} [2]=a\,\!})：lower =0，upper=0.64

When i = 3 ({\displaystyle \operatorname {X} [3]=a\,\!})：lower =0，upper=0.512

When i = 4 ({\displaystyle \operatorname {X} [4]=b\,\!})：lower =0.4096，upper=0.512

When i = 5 ({\displaystyle \operatorname {X} [5]=a\,\!})：lower =0.4096，upper=0.49152

When i = 6 ({\displaystyle \operatorname {X} [6]=a\,\!})：lower =0.4096，upper=0.475136

由於 lower =0.4096，upper=0.475136

lower <= 14\*{\displaystyle 2^{-5}\,\!} < 15\*{\displaystyle 2^{-5}\,\!} <= upper

所以編碼的結果為

{\displaystyle 14\_{\text{(2,5)}}=01110\,\!}

動態影像之編碼
-------

MPEG(Moving Picture Experts Group)為動態影像編碼的國際標準。
動態影像編碼的使用原理為：不同時間，同一個像素(pixel)之間的相關度通常極高，只需對有移動的物件(objects)記錄**移動向量(motion vector)**。

{\displaystyle \operatorname {F} [m,n,t]\,\!} ：時間為t的影像

如何由{\displaystyle \operatorname {F} [m,n,t]\,\!} ，{\displaystyle \operatorname {F} [m,n,t+delta]\,\!} 來預測 
{\displaystyle \operatorname {F} [m,n,t+2\*delta]\,\!}？

(1)移動向量{\displaystyle \operatorname {V\_{\text{x}}} [m,n]\,\!}，{\displaystyle \operatorname {V\_{\text{y}}} [m,n]\,\!}

(2)預測{\displaystyle \operatorname {F} [m,n,t+2\*delta]\,\!}：

{\displaystyle \operatorname {F\_{\text{p}}} [m,n,t+2\*delta]\,\!} = {\displaystyle \operatorname {F} [m-{V\_{\text{x}}}[m,n],n-{V\_{\text{y}}}[m,n],t+delta]\,\!}

(3)計算「預測誤差」

{\displaystyle \operatorname {E} [m,n,t+2\*delta]\,\!} = {\displaystyle \operatorname {F} [m,n,t+2\*delta]\,\!} - {\displaystyle \operatorname {F\_{\text{p}}} [m,n,t+2\*delta]\,\!}

對預測誤差 {\displaystyle \operatorname {E} [m,n,t+2\*delta]\,\!} 作編碼。

影像檔案的處理(Matlab)
---------------

### 基本概念

* 灰階影像在Matlab 當中是一個矩陣，彩色影像在Matlab 當中是三個矩陣，分別代表紅色(Red)、綠色(Green)、藍色(Blue)。

.bmp: 沒有經過任何壓縮處理的圖檔

.jpg: 有經過JPEG 壓縮的圖檔

* 要對影像做運算時，**要先變成double的格式**，否則電腦會預設影像為integer 的格式，在做浮點運算時會產生誤差。

例如，若要對影像做2D離散傅立葉轉換(Discrete Fourier transform)：

im=imread('C:\Program Files\MATLAB\pic\Pepper.bmp');

im=double(im);

Imf=fft2(im);

### 基本指令

* Image 檔讀取: imread
* Image 檔顯示: imshow, image, imagesc
* Image 檔製作: imwrite
* Video 檔讀取: aviread

### 範例

* 黑白影像

im=double(imread('C:\Program Files\MATLAB\pic\Pepper.bmp'));

(如果Pepper.bmp 是個灰階圖，im 將是一個矩陣)

size(im);

(用size 這個指令來看im 這個矩陣的大小)

image(im);

colormap(gray(256));

* 彩色影像

im2=double(imread('C:\Program Files\MATLAB\pic\Pepper512c.bmp'));

size(im2);

(由於這個圖檔是個彩色的，所以im2 將由三個矩陣複合而成)

压缩方法
----

图像压缩可以是有损数据压缩也可以是无损数据压缩。常见的应用有raw和tiff格式等。gif和jpeg是有损压缩。通过DCT变换后选择性丢掉人眼不敏感的信号分量，实现高压缩比率。

### 无损压缩

对于如绘制的技术图、图表或者漫画，优先使用无损压缩，这是因为有损压缩方法，尤其是在低的位速条件下，将会带来压缩失真，如医疗图像或者用于存档的扫描图像……等，这些有价值的内容的压缩也尽量选择无损压缩方法。

* 游程编码
* 熵編碼法
* 如LZW这样的自适应字典算法

### 有损压缩

有损方法非常适合于自然的图像，例如一些应用中图像的微小损失是可以接受的（有时是无法感知的），这样就可以大幅度地减小位速。

* 色彩空间：这是化减到图像中常用的颜色。所选择的颜色定义在压缩图像头的调色板中，图像中的每个像素都用调色板中颜色索引表示。这种方法可以与抖动一起使用以模糊颜色边界。
* 色度抽样：这利用了人眼对于亮度变化的敏感性远大于颜色变化，这样就可以将图像中的颜色信息减少一半甚至更多。
* 变换编码：这是最常用的方法。首先使用如离散余弦变换（DCT）或者小波变换这样的傅立叶相关变换，然后进行量化和用熵編碼法压缩。
* 分形压缩：

特性
--

图像压缩的目的就是在给定位速或者压缩比下实现最好的图像质量。但是，还有一些其它的图像压缩机制的重要特性：

* 可扩展编码 ：又稱渐进编码、嵌入式位流，通常表示操作位流和文件产生的质量下降（没有解压缩和再压缩）。尽管具有不同的特性，在无损编码中也有可扩展编码，它通常是使用粗糙到精细像素扫描的格式。尤其是在下载时预览图像（如浏览器中）或者提供不同的图像质量访问时（如在数据库中）可扩展编码非常有用，有几种不同类型的可扩展性：
	+ 质量渐进：又稱层渐进，位流渐进更新重建的图像。
	+ 分辨率渐进：首先在低分辨率编码图像，然后编码与高分辨率之间的差别。
	+ 成分渐进：首先编码灰度数据，然后编码彩色数据。

* 感兴趣区域编码：图像某些部分的编码质量要高于其它部分，这种方法可以与可扩展编码组合在一起（首先编码这些部分，然后编码其它部分）。
* 元数据信息：压缩数据可以包含关于图像的信息用来分类、查询或者浏览图像。这些信息可以包括颜色、纹理统计信息、小预览图像以及作者和版权信息。

压缩方法的质量经常使用峰值信噪比来衡量，峰值信噪比用来表示图象有损压缩带来的噪声。但是，观察者的主观判断也认为是一个重要的、或许是最重要的衡量标准。

参见
--

* 數據壓縮
* 图形文件格式
* 数字信号处理
* 图像处理
* 计算机图形学
* 萊娜圖
* 标准测试图像
* 图像质量
	+ 峰值信噪比
	+ 结构相似度

參考文獻
----

Jian-Jiun Ding, "Advanced Digital Signal Processing", NTU, 2021. 

  


|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
方法 |
| --- |
|  |
| 理论 | 
* 熵
* 语法（英语：）
* 信息论
* 柯氏复杂度
* 量化
* 率失真理论
* 

 |
|  |
|  | 

|  |  |
| --- | --- |
| 熵編碼 | 
* 算术编码
* 非对称数字系统编码（英语：）
* 格倫布編碼
* 霍夫曼编码
	+ 适应性
	+ 范型
	+ 改进
* 區間編碼
* 香农编码
* 香农-范诺编码
* 香農-范諾-埃利西斯編碼
* Tunstall编码（英语：）
* 一元编码（英语：）
* 通用編碼（英语：）
	+ 指數格倫布編碼
	+ 斐波那契編碼
	+ 以利亞伽瑪編碼
	+ 萊文斯坦編碼（英语：）

 |
|  |
| 字典編碼（英语：） | 
* 字节对编码
* LZ77 / LZ78
	+ 842（英语：）
	+ Brotli
	+ Deflate
	+ LZ4
	+ LZFSE
	+ LZJB（英语：）
	+ LZMA
	+ LZO
	+ LZRW（英语：）
	+ LZS（英语：）
	+ LZSS
	+ LZW
	+ LZWL（英语：）
	+ LZX
	+ Snappy
	+ Zstandard

 |
|  |
| 其他 | 
* BWT
* CTW（英语：）
* 差分编码
* DMC
* 差分脉冲编码调制
* 无损离散余弦变换
* MTF
* PAQ（英语：）
* PPM（英语：）
* RLE

 |

 |
|  |
|  | 

|  |  |
| --- | --- |
| 变换编码 | 
* DCT
	+ MDCT
* DST
* FFT
* 小波变换
	+ 多贝西
	+ DWT
	+ SPIHT（英语：）

 |
|  |
| 预测编码 | 
* DPCM
	+ ADPCM（英语：）
* LPC
	+ ACELP（英语：）
	+ CELP
	+ LAR（英语：）
	+ LSP（英语：）
	+ WLPC（英语：）
* 运动
	+ 运动补偿
	+ 运动预测
	+ 运动矢量
* 心理声学

 |

 |
|  |
|  | 

|  |  |
| --- | --- |
| 概念 | 
* 码率
	+ 平均码率
	+ 恒定码率
	+ 可变码率
* 压扩（英语：）
* 卷积
* 动态范围
* 延迟（英语：）
* 采样
* 采样定理
* 音质
* 语音编码
* 子带编码

 |
|  |
| 编解码组件 | 
* A-law（英语：）
* μ-law（英语：）
* DPCM
	+ ADPCM（英语：）
	+ DM
* FT
	+ FFT
* LPC
	+ ACELP（英语：）
	+ CELP
	+ LAR（英语：）
	+ LSP（英语：）
	+ WLPC（英语：）
	+ CELP
	+ MDCT
* 心理聲學模型

 |

 |
|  |
|  | 

|  |  |
| --- | --- |
| 概念 | 
* 色度抽样
* 编码树单元
* 色彩空間
* 壓縮失真
* 图像分辨率
* 宏块
* 像素
* 峰值信噪比
* 量化
* 标准测试图像

 |
|  |
| 方法 | 
* DCT
* Deflate
* 分形压缩
* K-L变换
* LP（英语：）
* RLE
* 小波变换
	+ 多贝西
	+ DWT
	+ SPIHT（英语：）

 |

 |
|  |
|  | 

|  |  |
| --- | --- |
| 概念 | 
* 码率
	+ 平均码率
	+ 恒定码率
	+ 可变码率
* 显示分辨率
* 帧（英语：）
* 帧率
* 帧类型
* 隔行扫描
* 視訊特性
* 視訊質量

 |
|  |
| 编解码组件 | 
* DCT
* DPCM
* 去区块滤波器
* 重叠变换（英语：）
* 运动
	+ 运动补偿
	+ 运动预测
	+ 运动矢量
* 量化

 |

 |
|  |
| 另见压缩格式和数据压缩 |

 |

|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
计算机科学的主要领域 |
| --- |
|  |
| 注：该模板大致遵循ACM 电脑分类系统。 |
|  |
| 计算机硬件 | 
* 印刷电路板
* 外部设备
* 集成电路
* 超大规模集成电路
* 绿色计算
* 電子設計自動化

 |
|  |
| 系统架构组织 | 
* 電腦系統架構
* 嵌入式系统
* 实时计算

 |
|  |
| 网络 | 
* 网络传输协议
* 路由
* 网络拓扑
* 网络服务

 |
|  |
| 软件组织 | 
* 直譯器
* 中间件
* 虛擬機器
* 操作系统
* 软件质量

 |
|  |
| 软件符号和工具 | 
* 编程范型
* 编程语言
* 編譯器
* 领域特定语言
* 軟體框架
* 集成开发环境
* 软件配置管理
* 函式庫

 |
|  |
| 软件开发 | 
* 软件开发过程
* 需求分析
* 软件设计
* 软件部署
* 軟體維護
* 开源模式

 |
|  |
| 计算理论 | 
* 自动机
* 可计算性理论
* 計算複雜性理論
* 量子计算
* 数值计算方法
* 计算机逻辑
* 形式语义学

 |
|  |
| 算法 | 
* 算法分析
* 算法设计
* 算法效率
* 随机化算法
* 计算几何

 |
|  |
| 计算数学 | 
* 离散数学
* 信息与计算科学
* 统计学
* 数学软件
* 数理逻辑
* 集合论
* 数论
* 图论
* 类型论
* 范畴论
* 信息论
* 数值分析
* 数学分析

 |
|  |
| 信息系统 | 
* 数据库管理系统
* 電腦數據
* 企业信息系统（英语：）
* 社会性软件
* 地理信息系统
* 决策支持系统
* 过程控制
* 数据挖掘
* 數位圖書館
* 系统平台
* 數位行銷
* 万维网
* 信息檢索

 |
|  |
| 安全 | 
* 密码学
* 形式化方法
* 入侵检测系统
* 网络安全
* 信息安全

 |
|  |
| 人机交互 | 
* 计算机辅助功能
* 用户界面
* 可穿戴计算机
* 普适计算
* 虚拟现实
* 聊天機器人

 |
|  |
| 并发性 | 
* 并发计算
* 并行计算
* 分布式计算
* 多线程
* 多元處理

 |
|  |
| 人工智能 | 
* 自动推理
* 计算语言学
* 计算机视觉
* 进化计算
* 专家系统
* 自然语言处理
* 机器人学

 |
|  |
| 机器学习 | 
* 監督式學習
* 無監督學習
* 强化学习
* 交叉驗證

 |
|  |
| 计算机图形学 | 
* 计算机动画
* 可视化
* 渲染
* 修飾照片
* 圖形處理器
* 混合现实
* 虚拟现实
* 图像处理
* 图像压缩
* 实体造型

 |
|  |
| 应用计算 | 
* 电子商务
* 企业级软件
* 计算数学
* 计算物理学
* 计算化学
* 计算生物学
* 計算社會科學
* 医学信息学
* 数字艺术
* 電子出版
* 網絡戰
* 电子游戏
* 文字处理器
* 運籌學
* 教育技术学
* 生物信息学
* 认知科学
* 文件管理系统（英语：）

 |
|  |
| 
* 分类 **分类**
* 主题 **主题**
* 专题**专题**
* 共享资源页面 **维基共享**

 |

 |