1、dc係數的中間格式計算
jpeg中為了更進一步節約空間,並不直接儲存資料的具體數值,而是將資料按照位數分為16組,儲存在表裡面。這也就是所謂的變長整數編碼
vli。即,第
0組中儲存的編碼位數為
0,其編碼所代表的數字為0;第
1組中儲存的編碼位數為
1,編碼所代表的數字為
-1或者
1......
,如下面的**所示,這裡,暫且稱其為
vli編碼表:
前面提到的那個dc
差值為3
的資料,通過查詢
vli可以發現,整數3位於
vli**的第
2組,因此,可以寫成(2)(
3)的形式,該形式,稱之為
dc係數的中間格式。
2、ac係數的行程長度編碼
(rlc)
量化之後的ac
係數的特點是,
63個係數中含有很多值為
0的係數。因此,可以採用行程編碼
rlc(
run length coding
)來更進一步降低資料的傳輸量。利用該編碼方式,可以將乙個字串中重複出現的連續字元用兩個位元組來代替,其中,第乙個位元組代表重複的次數,第二個位元組代表被重複的字串。例如,(
4,6)就代表字串「
6666
」。但是,在
jpeg
編碼中,
rlc的含義就同其原有的意義略有不同。在
jpeg
編碼中,假設
rlc編碼之後得到了乙個(
m,n)的資料對,其中
m是兩個非零
ac係數之間連續的
0的個數(即,行程長度),
n是下乙個非零的
ac係數的值。採用這樣的方式進行表示,是因為
ac係數當中有大量的
0,而採用
zigzag
掃瞄也會使得
ac係數中有很多連續的
0的存在,如此一來,便非常適合於用
rlc進行編碼。
例如,現有乙個字串,如下所示:
57,45,0,0,0,0,23,0,-30,-8,0,0,1,000.....
經過rlc
之後,將呈現出以下的形式:
(0,57) ; (0,45) ; (4,23) ; (1,-30) ; (0,-8) ; (2,1) ; (0,0)
注意,如果ac
係數之間連續
0的個數超過
16,則用乙個擴充套件位元組
(15,0)
來表示16
連續的0
。3、ac係數的中間格式
根據前面提到的vli
**,對於前面的字串:
(0,57) ; (0,45) ; (4,23) ; (1,-30) ; (0,-8) ; (2,1) ; (0,0)
只處理每對數右邊的那個資料,對其進行vli
編碼:
查詢上面的
vli編碼**,可以發現,
57在第
6組當中,因此,可以將其寫成
(0,6),57
的形式,該形式,稱之為
ac係數的中間格式。
同樣的(0,45)
的中間格式為:
(0,6),45
;(1,-30)的中間格式為:
(1,5),-30
;4、熵編碼
在得到dc
係數的中間格式和
ac係數的中間格式之後,為進一步壓縮略圖象資料,有必要對兩者進行熵編碼。jpeg
標準具體規定了兩種熵編碼方式:
huffman
編碼和算術編碼。
jpeg
基本系統規定採用huffman
編碼(因為不存在專利問題),但jpeg標準並沒有限制jpeg
演算法必須用
huffman
編碼方式或者算術編碼方式。
huffman編碼:對出現概率大的字元分配字元長度較短的二進位制編碼,對出現概率小的字元分配字元長度較長的二進位制編碼,從而使得字元的平均編碼長度最短。
huffman
編碼的原理請參考資料結構中的
huffman
樹或者最優二叉樹。
huffman編碼時dc
係數與ac
係數分別採用不同的huffman編碼表,對於亮度和色度也採用不同的huffman編碼表。因此,需要4
張huffman編碼表才能完成熵編碼的工作。具體的huffman編碼採用查表的方式來高效地完成。然而,在
jpeg
標準中沒有定義預設的
huffman
表,使用者可以根據實際應用自由選擇,也可以使用
jpeg
標準推薦的
huffman
表。或者預先定義乙個通用的
huffman
表,也可以針對一副特定的影象,在壓縮編碼前通過蒐集其統計特徵來計算
huffman
表的值。
下面我們舉例來說明8*8
影象子塊經過
dct及量化之後的處理過程:
假設乙個影象塊經過量化以後得到以下的係數矩陣:
15 0 -1 0 0 0 0 0
-2 -1 0 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
0 0 0 0 0 0 0 0
顯然,dc係數為15,假設前乙個8*8的影象塊的dc系數量化值為12,則當前dc系統同上乙個dc係數之間的差值為3,通過查詢vli編碼表,可以得到dc係數的中間格式為(2)(3),這裡的2代表後面的數字(3)的編碼長度為2位;之後,通過zigzag掃瞄之後,遇到第乙個非0的ac係數為-2,遇到0的個數為1,ac係數經過rlc編碼後可表示為(1,-2),通過查詢vli表發現,-2在第2組,因此,該ac係數的中間格式為(1,2)-2;
其餘的點類似,可以求得這個8*8子塊熵編碼的中間格式為
(dc)(2)(3);ac(1,2)(-2),(0,1)(-1),(0,1)(-1),(0,1)(-1),(2,1)(-1),(eob)(0,0)
對於dc係數的中間格式(2)(3)而言,數字2查dc亮度huffman表得到011,數字3通過查詢vli編碼表得到其被編碼為11;
對於ac係數的中間格式(1,2)(-2)而言,(1,2)查ac亮度huffman表得到11011,-2通過查詢vli編碼表得到其被編碼為01;
對於ac係數的中間格式(0,1)(-1)而言,(0,1)查ac亮度huffman表得到00,數字-1通過查詢vli編碼表得到其被編碼為0;
對於ac係數的中間格式(2,1)(1)而言,(2,1)查ac亮度huffman表得到11100,數字-1通過查詢vli編碼表得到其被編碼為0;
對於ac係數的中間格式(0,0)而言,查ac亮度huffman表得到1010;
因此,最後這個8*8子塊亮度資訊壓縮後的資料流為01111,1101101,000,000,000,111000,1010。總共31位元,其壓縮比是64*8/31=16.5,大約每個畫素用半個位元。
5、dc 和ac亮度huffman表
脈衝係數和車速
最近接觸汽車行駛記錄儀,對車速和脈衝係數不太理解,查了一些資料以後,在這裡整理一下。車速訊號產生的原理 通過感測器產生與車輪的轉數成正比的脈衝訊號。在汽車ecu內部,通過一定的公式採集到的脈衝數,來反算出車速。脈衝係數計算 脈衝係數 即車輛行駛每公里里程時驅動速度感測器的脈衝數數記錄儀等一些車載裝置...
k mean和k mean 和輪廓係數
k mean演算法是一種聚類演算法。他的優化目標是 我們使用座標下降法,對uk求導數為0得到uk 1 m xi xi明顯是標記為最近的中心點是函式最小化,不斷迭代直到收斂。問題是,演算法開始時我們先要指定分類數k,這是乙個不確定的數。我採取的做法是不斷嘗試k,取輪廓係數最小的k為最優k。輪廓係數為 ...
縮放係數計算
把乙個物品放入到乙個背景框中,背景框可能比物品大,也可能比物品小,那麼就需要進行縮放,才能是物品很好的放入背景框中。縮放係數 local scale itembgsize.width itemimage getcontentsize width itemimage setscale scale 0....