jpeg压缩算法学习(2)——ZigZag

上一篇:jpeg压缩算法学习(1)——离散余弦变换-CSDN博客

ZigZag算法

上一篇学习了离散余弦变换(DCT),像素值在进行离散余弦变换后,大的数值都集中在左上角,例如下面这样:

338145-818-7414-14
162-41323-1-139
-1757-2-2-2016210
4119-2431-19-84-1
-597-2-3221-16-15
-1912320-16-9-1512
7-12-917515-40
15-111011-10-13100

称为能力集中(Energy Compaction),这为有损压缩提供可能性,就是将右下角数值小的部分舍弃掉。

ZigZag算法目的是将离散变换后的二维数组转成一维数组,且将大数值(高能力)放在一维数组前面,小数值(低能力)放在一维数组末尾,方便后面进行霍夫曼编码。

为了达到这个目的,可以按下面的顺序来存放数值:

 代码

const char ZigZag[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,51,55,60,
	21,34,37,47,50,56,59,61,
	35,36,48,49,57,58,62,63 
}; 


int zigZagIndex = ZigZag[v * 8 + u]; // u指像素矩阵的列,v指行
fdc_data[zigZagIndex] = (short) ((short)(temp + 16384.5) - 16384);

以上代码来自github上的开源项目: https://github.com/thejinchao/jpeg_encoder.git

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值