opencv圖像分析與處理(15)- 圖像壓縮中的編碼方法:霍夫曼編碼、Golomb編碼、Rice編碼、算術編碼及其實現

本節爲opencv數字圖像處理(15):圖像壓縮的第二小節,圖像壓縮中的編碼方法:霍夫曼編碼、Golomb編碼、Rice編碼、算術編碼及其實現,主要包括:霍夫曼編碼、Golomb編碼、Rice編碼、算術編碼的原理與實現代碼

1. 霍夫曼編碼

  霍夫曼編碼對每個信源符號產生可能最小數量的編碼符號。第一步是通過對所考慮的符號的概率進行排序,並將具有最小概率的符號合併爲一個符號代替下次信源化簡過程的符號,從而創建一個簡化信源系列,過程如下圖所示,重複合併直到信源只有兩個符號的簡化信源爲止:
在這裏插入圖片描述

  第二步是對每個化簡後的信源進行編碼,從最小的信源開始,直到遍歷原始信源。對兩個符號信源的最小長度的二值碼是0和1,這些符號被分配給最右邊的兩個符號(並不規定順序,誰0誰1無所謂),整個過程如下圖所示:
在這裏插入圖片描述
  這樣編碼的平均長度爲:Lavg=0.41L_{avg}=0.4*1+032+0.13+0.14+0.065++03*2+0.1*3+0.1*4+0.06*5+0.045=2.20.04*5=2.2比特/像素。之後也可以通過從左到右的順序對串中每個符號進行分析來解碼,對於一個編碼串010100111100進行從左到右掃描,對應上表中的編碼,可以發現,第一個有效碼字爲01010,對應a3a_3,下一個是011對應a1a_1,最終完全解碼的消息爲a3a1a2a2a6a_3a_1a_2a_2a_6

  當對大量符號進行編碼時,最佳霍夫曼編碼的構造也比較複雜。對於有JJ個信源符號的通常情況,需要JJ個符號概率,J2J-2次信源簡化和J2J-2次編碼賦值,當事先信源符號的概率可以估計時,使用預計算的霍夫曼編碼可以達到接近最佳的編碼,一些通用的圖像壓縮標準比如JPEG和MPEG,都規定了默認的霍夫曼編碼表。同樣適用霍夫曼編碼的壓縮標準還有CCITT、JBIG2、H.261、H.262、H.263、H.264等。

2. Golomb編碼

  哥倫布編碼時具有指數衰減概率分佈輸入的非負整數編碼。給定一個非負整數和一個正整數除數m,表示爲Gm(n)G_m(n)的n關於m的Golomb編碼時商n/m下取整{n/m}的一元編碼和nmodmn mod m的二進制表示的一個合併,Gm(n)G_m(n)構建如下:

  • 形成商n/m下取整{n/m}的一元編碼(整數q的一元編碼定義爲q個1緊跟着一個0)
  • k=log2mk= 上取整{log_2m}c=2km,r=n mod mc=2^k-m,r=n\ mod\ m,並計算截短的餘數rr'使其滿足0r<c0\leq r< cr=k1r'=k-1,其他情況r=kcr'=k-c
  • 連接上兩步的結果

  例如G4(9)G_4(9)9/4=2下取整{9/4}=2的一元編碼110,令k=log24=2k=上取整{log_24}=2,c=224=0,r=9mod4c=2^2-4=0,r=9 mod 4r=kc=2r‘=k-c=2。所以最後的結果就是110和01的連接即G4(9)=11001G_4(9)=11001,可以看到這種編碼計算上要比最佳霍夫曼簡單很多。

  當m=2k,c=0m=2^k,c=0時,產生的編碼又稱爲Golomb-Rice編碼或Rice碼。當被表示的整數具有概率質量函數的集合分佈時:P(n)=(1ρ)ρn,0<ρ<1P(n)=(1-\rho)\rho^n,0<\rho<1,可以證明Golobm碼是最佳的,即當m=log2(1+ρ)log2(1/ρ)m=\frac{log_2(1+\rho)}{log_2(1/\rho)}時,Gm(n)G_m(n)爲所有唯一可判度的編碼提供了最短的平均碼長。

3. 算術編碼

  算術編碼也是一種熵編碼但生成的是非塊碼,假設有一個來自四符號信源的五符號序列a3a1a2a3a4a_3a_1a_2a_3a_4,其中信源的概率分別爲0.1、0.2、0.3和0.4,則按照信號的概率可以將[0,1)[0,1)區間劃分爲[0,0.1)[0.1,0.3)[0,0.1)、[0.1,0.3)[0.3,0.6)[0.6,1)[0.3,0.6)、[0.6,1)四部分。然後讀入信號,第一個符號a3a_3,佔據區間[0.3,0.6)[0.3,0.6),這樣編碼間隔變爲[0.3,0.6)[0.3,0.6);然後讀入第二個符號a1a_1,佔原始區間的前10%,則編碼間隔進一步變化,變爲[0.3,0.33)[0.3,0.33);然後讀入a2a_2,佔原始區間的10%—30%,則編碼間隔進一步變化,變爲[0.303,0.309)[0.303,0.309);然後讀入a3a_3,佔原始區間的30%—60%,編碼間隔變爲[0.3048,0.3066)[0.3048,0.3066);最後讀入a4a_4,佔原始區間的60%—100%,編碼間隔變爲[0.30588,0.3066)[0.30588,0.3066),然後從這個區間上任選一個數作爲編碼輸出,比如取0.306。

  解碼的時候同樣需要知道信源的概率0.1、0.2、0.3和0.4,編碼輸出爲0.306,原始符號序列長度爲5。開始解碼:0.306在區間[0.3,0.6)[0.3,0.6),所以第一個符號爲a3a_3;而0.306在[0.3,0.6)[0.3,0.6)的前10%[0.3,0.33)[0.3,0.33),所以第二個符號爲a1a_1;而0.306在[0.3,0.33)[0.3,0.33)的10%—30%[0.303,0.309)[0.303,0.309)上,所以第三個編碼爲a2a_2;而0.306在區間[0.303,0.309)[0.303,0.309)的30%—60%[0.3048,0.3066)[0.3048,0.3066),所以第四個符號爲a_3;而0.306在區間[0.3048,0.3066)[0.3048,0.3066)的%60—100%,所以最後一個符號爲a4a_4


歡迎掃描二維碼關注微信公衆號 深度學習與數學   [每天獲取免費的大數據、AI等相關的學習資源、經典和最新的深度學習相關的論文研讀,算法和其他互聯網技能的學習,概率論、線性代數等高等數學知識的回顧]
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章