本人的研究方向是Multimedia Compute ,最近迷上了某美劇,男主做壓縮算法起家,於是毫無抗拒的開始學習杜克大學在coursera上的公開課(第一週講了關於精度和量化等基礎,如果有不熟悉的童鞋可以看看課程視頻哦)。在這裏希望能與想了解圖像視頻壓縮算法的童鞋分享學習心得!
圖像壓縮有很多標準,課程中只以JPEG爲例來講解。JPEG流程圖如下
從一張圖片的灰度(像素值)直方圖可以看出,像素值出現的概率多數情況下是不同的,所以可以認爲並不是所有的像素值都有必要用8bit來代表。Huffman coding就是用較少的bit來表示較常出現的像素值。如下是已知像素值分佈的圖像,用Huffman coding來精簡圖像信息的過程。
首先通過統計直方圖,將像素值按照出現概率從大到小排列,然後每次迭代都將最小的兩個概率合併,記錄合併節點,再重新排序,直到只剩下兩個概率停止forward的過程,此時可以說從下往上建立了一棵節點樹。接下來就是從上往下給節點反向賦值的過程,也就是JPEG壓縮的流程的Symbol encoder,給像素值重新賦予可逆(decoder可解)的符號。如果我們記錄了合併節點,那麼反向時就在這些點稱做“分裂點”,每次經過分裂點都會增加1bit符號位,重要的是這些符號都是“前綴無關”的(否則decoder無法解釋的符號串內含有的像素值)。
爲什麼Huffman coding是優化的壓縮編碼呢?
可以從信息熵的角度來看,壓縮算法就是去掉信息中的冗餘。一般來說,均勻分佈的情況下,假定一個字符(或字符串)在文件中出現的概率是p,那麼在這個位置上最多可能出現1/p種情況。需要log2(1/p)個二進制符號位。
推廣到一般情況,假定文件由n個部分組成,每個部分的內容在文件中的出現概率分別是p1,p2,p3…pn。那麼,二進制符號位最少(即壓縮極限)爲:
log2(1/p1)+ log2(1/p2) + ... + log2(1/pn)
= ∑ log2(1/pn)
該公式的等價形式
p1*log2(1/p1)+ p2*log2(1/p2) + ... + pn*log2(1/pn)
= ∑ pn*log2(1/pn)
= E( log2(1/p))
可以說熵就是Huffman coding壓縮的平均符號位長度。