图像压缩是数据压缩技术在数字图像上的应用,目的是减少图像数据中的冗余信息,从而用更加高效的格式存储和传输数据。
資料越一致,代表統計特性越集中,包括傅立葉轉換域(Fourier transform domain)、直方圖(histogram)、特徵值(eigenvalue)......等方面的集中度。壓縮的通則即是利用資料的一致性,越一致的資料,越能夠進行壓縮。除此之外,也可利用資料的規則性與可預測性來對其作壓縮。通常而言,若可以用比較精簡的自然語言來描述一個東西,那麼也就越能夠對這個東西作壓縮。
影像中每一點的值,會和相鄰的點的值非常接近。
F [ m , n + 1 ] {\displaystyle \operatorname {F} [m,n+1]\,\!} ≈ F [ m , n ] {\displaystyle \operatorname {F} [m,n]\,\!}
F [ m + 1 , n ] {\displaystyle \operatorname {F} [m+1,n]\,\!} ≈ F [ m , n ] {\displaystyle \operatorname {F} [m,n]\,\!}
直方圖(histogram)是統計出現次數的一種方法,它會去計算一個向量(vector)或一個矩陣(matrix)當中,有多少個點會等於某一個值。
舉例來說, x [ n ] = [ 1 , 2 , 3 , 4 , 4 , 5 , 5 , 3 , 5 , 5 , 4 ] {\displaystyle \operatorname {x} [n]=[1,2,3,4,4,5,5,3,5,5,4]\,\!}
則 x [ n ] {\displaystyle \operatorname {x} [n]\,\!} 的直方圖(histogram)為 h [ 1 ] = 1 {\displaystyle \operatorname {h} [1]=1\,\!} , h [ 2 ] = 1 {\displaystyle \operatorname {h} [2]=1\,\!} , h [ 3 ] = 2 {\displaystyle \operatorname {h} [3]=2\,\!} , h [ 4 ] = 3 {\displaystyle \operatorname {h} [4]=3\,\!} , h [ 5 ] = 4 {\displaystyle \operatorname {h} [5]=4\,\!}
將影像相臨值的差異,利用直方圖(histogram)來統計,會發現值幾乎都落在0附近。
一張影像的頻譜大多集中在低頻的地方。 影像的「頻率」是在空間域(space domain)作分析:
壓縮的技術分成兩種:失真壓縮(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)。
此技術運用的是空間上的一致性。
將像素(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)的方式:
C b [ 2 m + 1 , 2 n ] {\displaystyle \operatorname {C_{\text{b}}} [2m+1,2n]\,\!} = 1/2 ×( C b [ 2 m , 2 n ] {\displaystyle \operatorname {C_{\text{b}}} [2m,2n]\,\!} + C b [ 2 m + 2 , 2 n ] {\displaystyle \operatorname {C_{\text{b}}} [2m+2,2n]\,\!} )
此技術運用的是頻率上的一致性。
通常我們會將影像切成8×8的方格作離散餘弦轉換(DCT),原因如下:
經過離散餘弦轉換(DCT)後的8×8矩陣稱為DCT矩陣。DCT矩陣最左上角的係數稱為直流(DC)成分,而其他63個係數則稱為交流(AC)成分。越靠近DC值的AC值係數表示頻率較低的部分,而越往右下角方向的AC值代表的頻率則越高。
2D的8×8 DCT的輸出通常會按照"zigzag"的順序,將2D轉為1D的型態。按照此順序排列,能量可能較大的會被擺在前面,而後面的高頻成分從某個值開始後幾乎為零,以符號EOB(end of block)表示,指後面的高頻的部分經過量化(quantization)之後皆為0。
差分編碼指的是,除第一個元素外,將其中各元素都表示為各該元素與其前一元素的差的編碼。
對 DC [ i , j ] {\displaystyle \operatorname {DC} [i,j]\,\!} ,是針對 DC [ i , j ] {\displaystyle \operatorname {DC} [i,j]\,\!} - DC [ i , j − 1 ] {\displaystyle \operatorname {DC} [i,j-1]\,\!} 去編碼, 而不是直接對 DC [ i , j ] {\displaystyle \operatorname {DC} [i,j]\,\!} 作編碼。
霍夫曼編碼(Huffman coding)的編碼原則:(Greedy Algorithm)
不滿足以上的條件則往上推一層。
霍夫曼編碼(Huffman coding)是將每一筆資料分開編碼,算術編碼(Arithmetic coding)則是將多筆資料一起編碼,因此壓縮效率比霍夫曼編碼(Huffman coding)更高,近年來的壓縮資料大多使用算術編碼(Arithmetic coding)。
假設要對X來作二進位的編碼,且經過事先的估計, X [ i ] = a {\displaystyle \operatorname {X} [i]=a\,\!} 的機率為0.8, X [ i ] = b {\displaystyle \operatorname {X} [i]=b\,\!} 的機率為0.2。
若實際上輸入的資料為 X = a a a b a a {\displaystyle \operatorname {X} =aaabaa\,\!}
Initial( X [ 1 ] = a {\displaystyle \operatorname {X} [1]=a\,\!} ):lower =0,upper=0.8
When i = 2 ( X [ 2 ] = a {\displaystyle \operatorname {X} [2]=a\,\!} ):lower =0,upper=0.64
When i = 3 ( X [ 3 ] = a {\displaystyle \operatorname {X} [3]=a\,\!} ):lower =0,upper=0.512
When i = 4 ( X [ 4 ] = b {\displaystyle \operatorname {X} [4]=b\,\!} ):lower =0.4096,upper=0.512
When i = 5 ( X [ 5 ] = a {\displaystyle \operatorname {X} [5]=a\,\!} ):lower =0.4096,upper=0.49152
When i = 6 ( X [ 6 ] = a {\displaystyle \operatorname {X} [6]=a\,\!} ):lower =0.4096,upper=0.475136
由於 lower =0.4096,upper=0.475136
lower <= 14* 2 − 5 {\displaystyle 2^{-5}\,\!} < 15* 2 − 5 {\displaystyle 2^{-5}\,\!} <= upper
所以編碼的結果為
14 (2,5) = 01110 {\displaystyle 14_{\text{(2,5)}}=01110\,\!}
MPEG(Moving Picture Experts Group)為動態影像編碼的國際標準。 動態影像編碼的使用原理為:不同時間,同一個像素(pixel)之間的相關度通常極高,只需對有移動的物件(objects)記錄移動向量(motion vector)。
F [ m , n , t ] {\displaystyle \operatorname {F} [m,n,t]\,\!} :時間為t的影像
如何由 F [ m , n , t ] {\displaystyle \operatorname {F} [m,n,t]\,\!} , F [ m , n , t + d e l t a ] {\displaystyle \operatorname {F} [m,n,t+delta]\,\!} 來預測 F [ m , n , t + 2 ∗ d e l t a ] {\displaystyle \operatorname {F} [m,n,t+2*delta]\,\!} ?
(1)移動向量 V x [ m , n ] {\displaystyle \operatorname {V_{\text{x}}} [m,n]\,\!} , V y [ m , n ] {\displaystyle \operatorname {V_{\text{y}}} [m,n]\,\!}
(2)預測 F [ m , n , t + 2 ∗ d e l t a ] {\displaystyle \operatorname {F} [m,n,t+2*delta]\,\!} :
F p [ m , n , t + 2 ∗ d e l t a ] {\displaystyle \operatorname {F_{\text{p}}} [m,n,t+2*delta]\,\!} = F [ m − V x [ m , n ] , n − V y [ m , n ] , t + d e l t a ] {\displaystyle \operatorname {F} [m-{V_{\text{x}}}[m,n],n-{V_{\text{y}}}[m,n],t+delta]\,\!}
(3)計算「預測誤差」
E [ m , n , t + 2 ∗ d e l t a ] {\displaystyle \operatorname {E} [m,n,t+2*delta]\,\!} = F [ m , n , t + 2 ∗ d e l t a ] {\displaystyle \operatorname {F} [m,n,t+2*delta]\,\!} - F p [ m , n , t + 2 ∗ d e l t a ] {\displaystyle \operatorname {F_{\text{p}}} [m,n,t+2*delta]\,\!}
對預測誤差 E [ m , n , t + 2 ∗ d e l t a ] {\displaystyle \operatorname {E} [m,n,t+2*delta]\,\!} 作編碼。
.bmp: 沒有經過任何壓縮處理的圖檔
.jpg: 有經過JPEG 壓縮的圖檔
例如,若要對影像做2D離散傅立葉轉換(Discrete Fourier transform):
im=imread('C:\Program Files\MATLAB\pic\Pepper.bmp');
im=double(im);
Imf=fft2(im);
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变换后选择性丢掉人眼不敏感的信号分量,实现高压缩比率。
对于如绘制的技术图、图表或者漫画,优先使用无损压缩,这是因为有损压缩方法,尤其是在低的位速条件下,将会带来压缩失真,如医疗图像或者用于存档的扫描图像……等,这些有价值的内容的压缩也尽量选择无损压缩方法。
有损方法非常适合于自然的图像,例如一些应用中图像的微小损失是可以接受的(有时是无法感知的),这样就可以大幅度地减小位速。
图像压缩的目的就是在给定位速或者压缩比下实现最好的图像质量。但是,还有一些其它的图像压缩机制的重要特性:
压缩方法的质量经常使用峰值信噪比来衡量,峰值信噪比用来表示图象有损压缩带来的噪声。但是,观察者的主观判断也认为是一个重要的、或许是最重要的衡量标准。
Jian-Jiun Ding, “Advanced Digital Signal Processing”, NTU, 2021.