java jpeg压缩解码_JPEG图像压缩原理简介
JPEG(發音:[?d?e?p?g])是一種針對照片視頻而廣泛使用的有損壓縮標準方法。
這個名稱代表 Joint Photographic Experts Group(聯合圖像專家小組)。聯合圖像專家小組1992年發布了JPEG的標準而在1994年獲得了ISO 10918-1的認定。JPEG與視頻音頻壓縮標準的MPEG(Moving Picture Experts Group)很容易混淆,但兩者是不同的組織及標準。
其實JPEG不是一種文件格式,它是由聯合圖像專家小組推出的一種圖像壓縮方法(類似于視頻中的H.264等編解碼標準)。而JPG或者JFIF格式僅僅是一種數據的包裝容器(類似于視頻中MP4、MOV等封裝格式)。
1. 概述
JPEG編碼的主要流程是:色彩空間轉換 (Color Conversion)、下采樣(Downsampling)、 分塊 (Dividing Patch) 、離散余弦變換(Discrete cosine transform)、量化(Quantization)、熵編碼技術(Entropy coding)。
2. 色彩空間轉換(Color Conversion)
我們使用傳感器采集到的原始(RAW)圖像使用的是RGB色彩空間來表示的。也就是說,按照每一個像素的RGB(Red, Green, Blue)值填充到對應的像素位置。
首先,我們將RGB(紅綠藍)轉換為一種稱為YCrCb (YUV)的不同色彩空間。
?Y成分表示一個像素的亮度 (luminance) ?U成分表示色度(飽和度)(Chrominance)?V成分表示色度(飽和度)
RGB空間到YUV空間轉換公式為:
下圖為分解開的Y、U、V的示例:
3. 采樣(Downsampling)
下采樣、也就是減少人類視覺系統不敏感的色度(U和V的成分)。雖然減少了顏色數量,但是人眼并不會察覺到圖像質量有任何的差異。
JPEG上這種縮減取樣的比例可以是4:4:4(無縮減取樣),4:2:2(在水平方向2的倍數中取一個,顏色為之前的 1/2),以及最普遍的4:2:0(在水平和垂直方向 2 的倍數中取一個,顏色為之前的 1/4)。
如圖:
4. 分塊 (Dividing Patch)
源圖像中每點的 3 個分量是交替出現的,先要把這 3 個分量分開,存放到 3 張表中去。然后由左及右,由上到下依次讀取 8*8 的子塊,存放在長度為 64 的表中,即可以進行DCT變換。如果原始圖片的長寬不是 8 的倍數, 都需要先補成 8 的倍數, 使其可以進行一塊塊的處理。編碼時,程序從源數據中讀取一個 8*8的數據塊后,進行 DCT 變換,量化,編碼,然后再讀取、處理下一個 8imes8 的數據塊。圖像的數據值必須減去128,是因為 DCT 公式所接受的數字范圍是 -128 到 127 之間。
5、離散余弦變換(Discrete Cosine Transform)
離散余弦變換是一種類似于傅里葉變換的數學工具(不清楚傅里葉變換的同學可以移步:https://www.bilibili.com/video/av19141078來簡單了解傅里葉變換).它將信號從時間域轉換到頻率域。
這一步,將視頻中的每個成分(Y, U, V)生成三個區域,每一個區域再劃分成如瓷磚般排列的一個個的 8*8 子區域,每一子區域使用二維的離散余弦變換(DCT)轉換到頻率空間。
如果有一個如這樣的的 8*8 的8-比特(0~255)子區域:
如圖:
用矩陣表示為:
原始數據每個值的范圍是 [0-255] ,使每個數字減去 128 ,標準化。
且接著使用離散余弦變換,和舍位取最接近的整數,得到結果為
左上角相當大的數值稱為DC系數(直流系數);其他 63 個值稱為AC系數(交流系數)。
6.量化
利用人眼對低頻數據敏感對高頻數據不敏感的特性,我們可以將離散余弦變換后的很多更高頻率的成分舍位成為接近 0 ,且剩下很多會變成小的正或負數。
JPEG標準中定義了量化表。
使用QYQY量化矩陣與前面所得到的DCT系數矩陣逐項相除,得到結果為:
7. 熵編碼技術(Entropy Coding)
熵編碼是一種無損壓縮的技術,它使用Z字形(zigzag)將矩陣數據排列。然后將排列后的數據使用哈夫曼編碼(哈夫曼編碼的資料請自行查找))。
對于前者量化的系數所作的Z字體序列會是:
?3, 0,?3, ?2, ?6,2, ?4, 1, ?3,1, 1, 5, 1, 2,?1, 1, ?1, 2, 0, 0,0, 0, 0, ?1, ?1, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0,0, 0, 0, 0,0, 0, 0,0, 0,0當剩下的所有系數都是零,對于過早結束的序列,JPEG有一個特別的霍夫曼編碼用詞。使用這個特殊的編碼用詞,EOB,該序列變為
?3, 0,?3, ?2, ?6,2, ?4, 1 ?3,1, 1, 5, 1, 2,?1, 1, ?1, 2, 0, 0,0, 0, 0, ?1, ?1, EOB在這一步數據量得到了極大的壓縮。
8. 結果
JPEG是一種有損壓縮算法。所以不同程度的壓縮比例,會呈現出不同的文件大小,以及差異化的可視化呈現。以下,呈現了相關的壓縮比例與原始圖像的對比。從上到下,呈現了壓縮比從小到大的結果。每一個圖片中,左邊是原始圖像,右邊是壓縮后的圖像。對應的文件大小顯示在圖線的上方。
9. 引用
https://ustc-dip.github.io/slice/Chapter8-圖像壓縮.pdf
https://en.wikipedia.org/wiki/JPEG
https://blog.csdn.net/songdan0201/article/details/51957758
https://taozhaojun.github.io/2016/01/17/camera/
https://compressjpeg.com
https://www.jianshu.com/p/71caefdb1e14
?
總結
以上是生活随笔為你收集整理的java jpeg压缩解码_JPEG图像压缩原理简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 查询语句 过滤_MySQL全
- 下一篇: randomized algorithm