ZigZag 與 反ZigZag編碼

分類:IT技術 時間:2017-07-01

如圖所示,ZigZag編碼就是將 8 x 8 的矩陣塊按照箭頭運動方向重新排列

在 Jpeg 圖像編碼中主要用於 RLE (Run-length encoding, 行程編碼),增加連續 0 的個數--增加壓縮比

其實現可以通過代碼,也可以通過查表實現

// ZigZag編碼表,以空間換時間,實現簡單
int ZigZagTable[64] =
 {
	  0,  1,  8, 16,  9,  2,  3, 10,
	 17, 24, 32, 25, 18, 11,  4,  5,
	 12, 19, 26, 33, 40, 48, 41, 34,
	 27, 20, 13,  6,  7, 14, 21, 28,
	 35, 42, 49, 56, 57, 50, 43, 36,
	 29, 22, 15, 23, 30, 37, 44, 51,
	 58, 59, 52, 45, 38, 31, 39, 46,
	 53, 60, 61, 54, 47, 55, 62, 63
 };

反ZigZag編碼 與 ZigZag編碼互為逆操作

// 反ZigZag編碼表
UnZigZagTable[64] = 
{
	 0,  1,  5,  6, 14, 15, 27, 28,
	 2,  4,  7, 13, 16, 26, 29, 42,
	 3,  8, 12, 17, 25, 30, 41, 43,
	 9, 11, 18, 24, 31, 40, 44, 53,
	10, 19, 23, 32, 39, 45, 52, 54,
	20, 22, 33, 38, 46, 41, 55, 60,
	21, 34, 37, 47, 50, 56, 59, 61,
	35, 36, 48, 49, 57, 58, 62, 63
};

Code:

void ZigZag(int mtx[64], int out[64])
{
	for (int i = 0; i < 64; i++)
		out[i] = mtx[ ZigZagTable[i] ];
}

void UnZigZag(int mtx[64], int out[64])
{
	for (int i = 0; i < 64; i++)
		out[i] = mtx[ UnZigZagTable[i] ];
}

ZigZag編碼後,可以用 UnZigZag反編碼

同樣,用 UnZigZag編碼,可以用 ZigZag反編碼

// 先 ZigZag, 後 UnZigZag
ZigZag(mtx, out);
UnZigZag(out, mtx);

// 先 UnZigZag, 後 ZigZag
UnZigZag(mtx, out);
ZigZag(out, mtx);

//上面兩組操作等價

在Window下的Jpeg 解碼中,如果使用 UnZigZag 反編碼,會導致圖像失真,而用 ZigZag反編碼才能正確解碼出原始圖像數據,所以猜測Window下的Jpeg圖像是使用 UnZigZag 方式對圖像進行壓縮的


Tags: ZigZag 編碼 UnZigZag 碼表 實現 int

文章來源:


ads
ads

相關文章
ads

相關文章

ad