【数据压缩】DPCM 压缩系统的实现和分析
来源:互联网 发布:辐射4捏脸数据 美女 编辑:程序博客网 时间:2024/06/05 15:08
一.实验原理
1.预测编码的基本原理
由于信源的相邻符号通常是相关的,利用信源相邻之间的相关性。根据某一模型利用以往的样本值对新样本进行预测,然后将样本的实际值与其预测值相减得到一个误差值,最后对这个误差值进行编码。
如果这个模型足够好,且样本序列在时间上相关性较强,则误差信号的幅度将远远小于原始信号,从而得到较大的数据压缩。
2.DPCM
DPCM是差分预测编码调制的缩写,是比较典型的预测编码系统。在DPCM中,需要注意的是预测器输入的是预测器的输入是已经编码的样本。因为在解码端,同样无法得到原始样本,只能得到存在误差的样本。因此,在DPCM编码器中实际内嵌了一个解码器,如编码器中虚线框中所示。
在一个DPCM系统中,有两个因素需要设计:预测器与量化器。理想情况下,预测器和量化器应该联合设计。但在实际中,采用一种次优的设计方法:分别进行线性预测器和量化器的优化设计。下图则为DPCM编码端与解码端的图示:
在本次实验中,采用的是固定预测器和均匀量化器。预测器采用的是左侧量化,对于图像中处于最左侧的一列像素,前面没有像素可以预测,则用预测灰度值的平均值128进行量化。
二.代码分析
int limit(int x) { if(x>255) return 255; if(x<0) return 0; return x; } ...... qn = (int *)malloc(Info_header.biWidth*Info_header.biHeight*sizeof(int)); q = (unsigned char *)malloc(Info_header.biWidth*Info_header.biHeight); rebuild = (unsigned char *)malloc(Info_header.biWidth*Info_header.biHeight); int scale = 512 / (1 << Qbits); for (int i = 0; i < Info_header.biHeight; i++) { qn[i*Info_header.biWidth ] = y_buf[i*Info_header.biWidth ] - 128; qn[i*Info_header.biWidth ] = qn[i*Info_header.biWidth ] +1/ scale; rebuild[i*Info_header.biWidth + j] = limit(qn[i*Info_header.biWidth + j] * scale + 128); q[i*Info_header.biWidth + j] = qn[i*Info_header.biWidth + j] +127; for (int j = 1; j < Info_header.biWidth; j++)//从第二列开始进入for循环 { qn[i*Info_header.biWidth + j] = y_buf[i*Info_header.biWidth + j] - rebuild[i*Info_header.biWidth + j - 1]; qn[i*Info_header.biWidth + j] = qn[i*Info_header.biWidth + j]+1 / scale; rebuild[i*Info_header.biWidth + j] = limit(qn[i*Info_header.biWidth + j] * scale + rebuild[i*Info_header.biWidth + j - 1]); q[i*Info_header.biWidth + j] = qn[i*Info_header.biWidth + j] +127; } }
处理程序在实验二BMP2YUV基础上进行即可,其中y_buf数组中已存储着图像的灰度值,作为编码器的输入。scale为量化因子,以4bit量化为例子,因为1<<=16,scale = 512/16=32。qn值除以32后,取值范围中共16位可选电平,符合16bit的量化要求。
由于像素灰度值的取值范围为0~255,任意两个像素的灰度值之差为-255~255,所以定义量化误差qn的数据类型为int类型;另外定义了一个字节大小的量化误差数组“q”,用于接受变换后的qn数据。假设进行8bit量化,而qn的可能位长为9bit,在量化时,若直接将其除于2,由于除法直接向下取整,范围变为-127~127,量化间隔仅有255个<2^8,所以量化语句写成:
qn[i*Info_header.biWidth + j] = qn[i*Info_header.biWidth + j]+1 / scale;
在qn原值加一再除以量化因子,则量化后范围变为-127~128,qn+127=q。q的取值范围则为0~255,符合8bit 256个量化级的要求。
在编码端重建图像时,应注意重建值有可能超过0~255的灰度区间,利用limit(int x)进行限制其取值。
三.实验结果
将八幅不同类型的样图进行DPCM变换,观测其重建图像,与差分数据的显示效果。对差分文件进行Huffman 编码,将其符号的分布统计得到下表结果。观测统计结果,得到结论:进行DPCM变换后,由于传输的是原值与预测值的一个差值,这个数值往往比较小,由于程序中将数值上抬127。与图标中128左右的概率分布较多相符。
压缩性能比较:
(源文件格式为:从bmp中提取灰度值转换的yuv)
由实验结果:空间冗余较大的图像,如odie.bmp,经过dpcm+熵编码会得到较大的压缩效率;而对应的空间冗余较少的图像,极端的如噪声分布图像 noise.bmp,经过dcpm+熵编码,依旧得不到很高的压缩比。这也符合霍夫曼编码规律,概率分布越集中,则压缩效率越高。综上,利用DPCM进行预测编码时,空间冗余越大,压缩效率越高。
- 数据压缩实验四:DPCM 压缩系统的实现和分析
- 【数据压缩】DPCM 压缩系统的实现和分析
- 数据压缩实验四 DPCM 压缩系统的实现和分析
- 数据压缩 实验四 DPCM压缩系统的实现和分析
- 数据压缩 实验四 DPCM压缩系统的实现和分析
- 数据压缩实验四 DPCM压缩系统的实现与分析
- 数据压缩实验四——DPCM压缩系统的实现和分析
- 数据压缩原理与应用 实验四 DPCM 压缩系统的实现和分析
- 数据压缩原理 实验四 DPCM压缩系统的实现和分析
- DPCM 压缩系统的实现和分析
- DPCM 压缩系统的实现和分析
- DPCM 压缩系统的实现和分析
- 实验四 DPCM 压缩系统的实现和分析
- 实验四 DPCM压缩系统的实现和分析
- 实验四 DPCM压缩系统的实现和分析
- 数据压缩实验四--dpcm压缩系统
- DPCM压缩实现
- test_04:DPCM 压缩实现
- Apache+PHP
- title: JavaFx自定义Tab-Order
- Ubuntu下忘记MySQL root密码解决方法
- 显示权限的名称
- Linux time时间概述
- 【数据压缩】DPCM 压缩系统的实现和分析
- Leetcode 312. Burst Balloons
- openssl之aes加密(AES_cbc_encrypt 与 AES_encrypt 的编程案例)
- Qt工具栏QToolBar、窗口布局的保存
- utc类型转换
- restclient使用get,post方式发送http请求
- 通过颜色矩阵创建花样二维码
- ES6中Array的学习
- Android 中InputMethodManager类的用法