数据压缩【实验四】DPCM压缩系统的实现和分析
目录
- 一、实验目的
- 二、实验原理
- 三、 实验代码
- (1)代码
- (2)输出结果
- 四、实验结果
- (1)压缩
- (2) PSNR峰值信噪比
- 原理
- 算法
- 重建图像
- 五、实验分析
一、实验目的
掌握DPCM编解码系统的基本原理
用C/C++/Python等语言编程实现DPCM编码器,并分析其压缩效率。
二、实验原理
DPCM是差分预测编码调制的缩写,是比较典型的预测编码系统。在DPCM系统中,需要注意的是预测器的输入是已经解码以后的样本。之所以不用原始样本来做预测,是因为在解码端无法得到原始样本,只能得到存在误差的样本。因此,在DPCM编码器中实际内嵌了一个解码器,如编码器中虚线框中所示。
在一个DPCM系统中,有两个因素需要设计:预测器和量化器。理想情况下,预测器和量化器应进行联合优化。实际中,采用一种次优的设计方法:分别进行线性预测器和量化器的优化设计。
三、 实验代码
由于我们采用左侧像素对图像进行DPCM编码,故每行第一个像素需要将原始值传去。其余的像素值进行计算残差、量化;然后重建时反量化。
(1)代码
DPCM
void DPCMLeft(int Width,int Height,void *yBuff,void *recBuff,void *errBuff)//DPCM向左预测
{unsigned char *yB=NULL;yB = (unsigned char *)yBuff;unsigned char *recB=NULL;recB = (unsigned char *)recBuff;unsigned char *errB=NULL;errB = (unsigned char *)errBuff;int P1,P2;//P1为当前值与预测值的误差,P2为量化后的误差unsigned char P3;//P3为反量化后的误差for(int i=0;i<Height;i++){for(int j=0;j<Width;j++){if(j == 0)//向左进行预测时,图像最左边一列的像素值直接输出,无需进行差分预测{*(recB+j+i*Width)=*(yB+j+i*Width);//当前值即为重建值,作为下一个像素的参考值*(errB+j+i*Width)=0;//误差为0}else//当不是最左边一列的像素时,进行DPCM{P1=*(yB+j+i*Width)-*(recB+(j-1)+i*Width);//求当前值与参考值的差值if(P1%2==0)//对差值进行8bit均匀量化,并进行+128的偏移以输出P2=P1/2+128;elseP2=(P1-1)/2+128;*(errB+j+i*Width)=unsigned char(P2);//将误差写入errB缓存区域P3=unsigned char(P2*2);//对量化后的误差反量化*(recB+j+i*Width)=*(recB+(j-1)+i*Width)+P3;//将参考值与反量化得到的误差相加,作为当前像素的重建值,即下一个像素的参考值}}}
}
8bit量化
dpBuf[i] = tmp / 2 + 128;out = yBuf[i - 1] + (dpBuf[i] - 128) * 2;if (out > 255)out = 255;if (out < 0)out = 0;yBuf[i] = out;
4bit量化
dpBuf[i] = tmp / 32 + 16;out = yBuf[i - 1] + (dpBuf[i] - 16) * 32;if (out > 255)out = 255;if (out < 0)out = 0;yBuf[i] = out;
主函数
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <malloc.h>
#include <string.h>
#include"DPCM.h"int main(int argc, char** argv)
{int frameWidth; int frameHeight; char* yFileName = NULL;//原始的灰度文件FILE* yFile = NULL;unsigned char* y_Buf = NULL;char* recFileName = NULL;//重建的图像文件FILE* recFile = NULL;unsigned char* rec_Buf = NULL;char* errFileName = NULL;//量化后的预测误差文件FILE* errFile = NULL;unsigned char* err_Buf = NULL;unsigned char* u_Buf = NULL;unsigned char* v_Buf = NULL;yFileName = argv[1];recFileName = argv[2];errFileName = argv[3];frameWidth = atoi(argv[4]);frameHeight = atoi(argv[5]);fopen_s(&yFile,yFileName, "rb");//打开灰度文件if (yFile == NULL){printf("cannot find y file\n");exit(1);}recFile = fopen(recFileName, "wb");//打开重建图像文件if (recFile == NULL){printf("cannot find yuv file\n");exit(1);}errFile = fopen(errFileName, "wb");//打开量化后的误差文件if (errFile == NULL){printf("cannot find yuv file\n");exit(1);}y_Buf = (unsigned char*)malloc(frameWidth * frameHeight * sizeof(unsigned char)); //开辟5个缓存空间u_Buf = (unsigned char*)malloc(frameWidth * frameHeight * sizeof(unsigned char) / 4);v_Buf = (unsigned char*)malloc(frameWidth * frameHeight * sizeof(unsigned char) / 4);rec_Buf = (unsigned char*)malloc(frameWidth * frameHeight * sizeof(unsigned char));err_Buf = (unsigned char*)malloc(frameWidth * frameHeight * sizeof(unsigned char)*1.5);if (y_Buf == NULL || rec_Buf == NULL || err_Buf == NULL || u_Buf == NULL ||v_Buf == NULL){printf("wrong malloc\n");exit(1);}fread(y_Buf, 1, frameWidth * frameHeight, yFile);//读取灰度文件数据if (y_Buf == NULL){printf("wrong fread\n");exit(1);}//DPCMLeft(frameWidth,frameHeight,y_Buf,rec_Buf,err_Buf);//向左进行预测DPCMUp(frameWidth,frameHeight,y_Buf,rec_Buf,err_Buf);//向上进行预测for(int i=0;i<frameHeight/2;i++){for(int j=0;j<frameWidth/2;j++){*(u_Buf+j+i*frameWidth/2)=128;*(v_Buf+j+i*frameWidth/2)=128;}}fwrite(rec_Buf, 1, frameWidth * frameHeight, recFile);//将数据写入文件进行输出fwrite(err_Buf, 1, frameWidth * frameHeight, errFile);fwrite(u_Buf, 1, frameWidth * frameHeight / 4, errFile);fwrite(v_Buf, 1, frameWidth * frameHeight / 4, errFile);//计算PSNRsimplest_yuv420_psnr(y_Buf,rec_Buf,frameWidth,frameHeight,1);free(y_Buf);free(rec_Buf);free(err_Buf);free(u_Buf);free(v_Buf);fclose(yFile);fclose(recFile);fclose(errFile);
}
(2)输出结果
8bit
残差图像
重建图像
4bit
残差图像
重建图像
四、实验结果
(1)压缩
我们将预测误差图像通过霍夫曼编码器压缩,与原图像直接压缩进行比较。
8bit:
压缩前 | 压缩后 |
---|---|
96kb | 43kb |
原图与8bit残差图像像素值概率分布图
4bit:
压缩前 | 压缩后 |
---|---|
96kb | 15kb |
原图与4bit残差图像像素值概率分布图
通过图像像素概率分布图我们可以明显看出残差图的像素值集中分布在一个小像素值区间中,这对霍夫曼编码压缩是极为有利的。
(2) PSNR峰值信噪比
原理
给定一张大小为m × n 的原始干净图像C,和一张同大小的重建的噪声图像N 。我们计算它俩之间的均方误差 MSE。
然后我们计算出原始图像可能出现的最大像素值。对于8位图像数据,这个值为255 。
最后,我们定义PSNR(dB)为
PSNR值越大,就代表失真越少
PSNR高于40dB说明图像质量极好(即非常接近原始图像),
在30—40dB通常表示图像质量是好的(即失真可以察觉但可以接受),
在20—30dB说明图像质量差;
算法
int simplest_yuv420_psnr(void *yBuff1,void *yBuff2, int w, int h, int num)//计算Y分量的PSNR
{unsigned char *yB1=NULL;yB1 = (unsigned char *)yBuff1;unsigned char *yB2=NULL;yB2 = (unsigned char *)yBuff2;for (int i = 0; i < num; i++){double mse_sum = 0, mse = 0, psnr = 0;for (int j = 0; j < h ; j++){for (int k = 0; k < w; k++){mse_sum += pow((double)(*(yB1+k+j*w) - *(yB2+k+j*w)), 2);//取每个差值的平方,并进行累加}}mse = mse_sum / (w * h); //根据公式计算msepsnr = 10 * log10(255.0 * 255.0 / mse); //根据公式计算psnrprintf("%5.3f\n", psnr);}system("pause");return 0;
}
重建图像
8bit:PSNR=51.177
4bit:PSNR=24.263
五、实验分析
(1)
(2)DPCM系统需要设计预测器、量化器,量化电平数要足够大(M>=8)(3)经过DPCM+熵编码之后,图像大小比直接使用熵编码减小的更多。
(4)经过DPCM+熵编码的PSNR值比只经过熵编码的PSNR值小,表明经过DPCM预测编码后重建出的图像质量比原始图像的质量差。
(5)和实际信号的分布相比,预测误差是关于0的高尖峰。因此,预测误差具有比原始密度更小的熵。这意味着预测的过程把样值间的大部分冗余去掉了。
(6)失真分析
斜率过载:量化步长跟不上信号变换的速度,量化bit越小,这个现象越明显。
粒状噪声:量化步长相当于信号变化的幅度来说太大了。
数据压缩【实验四】DPCM压缩系统的实现和分析相关推荐
- [实验四]DPCM 压缩系统的实现和分析
目录 一.实验原理 1.1 DPCM 1.2 量化 二.代码实现 2.1 程序说明 2.2 main.cpp 2.3 DPCM.h 2.4 DPCM.cpp 2.5 UV通道删除 三.实验测试 四. ...
- [数据压缩作业6]DPCM压缩系统的实现和分析
目录 (一)实验名称 (二)实验目的 (三)主要设备 (四)实验内容 一.原理 1. DPCM编解码 2. PSNR峰值信号噪声比 (五)实验步骤 一.DPCM编码系统的设计 二.代码 1. DPCM ...
- 数据压缩实验四--DPCM
数据压缩实验四--DPCM 实验原理 DPCM编解码原理 PSNR计算压缩质量 实验代码 DPCM.cpp main.cpp DPCM.h 实验步骤 实验图片的准备 命令参数 图像质量比较 8比特量化 ...
- Lab4 DPCM 压缩系统的实现和分析——C语言代码实现
Lab4 DPCM 压缩系统的实现和分析--C语言代码实现 一.实验原理 原理实现框图如下: 将输入的像素值与前一个像素值的预测值作差,并对差值进行编码 编码后的差值一路直接输出 编码后的差值另一路通 ...
- [数据压缩]实验四 DPCM编码
目录 一.实验框架 1.分析并实践DPCM压缩系统 2.掌握DPCM编解码系统原理,使用编程语言实现DPCM编码器. 二.DPCM编解码原理 DPCM函数(附) 三.DPCM编码系统设计 PSNR函数 ...
- 数据压缩(8):DPCM 压缩系统的实现和分析
1.DPCM编解码原理 DPCM是差分预测编码调制的缩写,是比较典型的预测编码系统.在DPCM系统中,需要注意的是预测器的输入是已经解码以后的样本.之所以不用原始样本来做预测,是因为在解码端无法得到原 ...
- DPCM压缩系统的实现与分析
目录 一.实验目的 二.实验原理 1.DPCM编解码原理 2.PSNR峰值信噪比 三.实验步骤 四.实验代码 1.DPCM 2.PSNR 3.主函数 五.实验结果与分析 1.压缩质量 以下图为例 其他 ...
- DPCM压缩系统的实现和分析
目录 实验目的 实验原理 DPCM编解码原理 线性预测器的设计 图像客观质量评价 均方误差 信噪比SNR 峰值信噪比PSNR Huffman编码 代码 dpcm.h DPCM.cpp frequenc ...
- DPCM 压缩系统的实现和分析
DPCM基本原理 DPCM即查分预测编码调制,将一个像素与上一个像素的差量化,得到预测误差. 本实验中采用右侧减左侧得到差值来预测,量化器采用8比特均匀量化. 编码代码 /* y_buffer:存储y ...
最新文章
- (转)#Pragma用法
- linux递归创建文件夹_Python中并发请求创建文件夹带来的线程安全问题
- Dubbo消费者代理的创建
- 自学python能找到工作吗-自学 Python,我是如何找到工作的?
- IT项目经验和难点分享
- 强烈推荐-百度网盘不限速下载网站
- 谷粒商城笔记 + 完整代码 + 课件资料(基础篇)(学习记录)
- 2020年10款网盘大比拼,总有一款适合你
- Oracle 绑定变量详解
- GSM+GPRS通信模块SIM800C介绍
- 远程登陆Win10自带子系统Ubuntu-22.04
- 华科计算机学院专业课,华科计算机考研专业课有哪些
- 如何为iTunes Connect准备应用
- java8(三)Stream API
- 网络编程和网络应用开发
- 如何将SW工程图转换成CAD格式?
- 谷歌浏览器英文页面翻译成中文<配置方式>
- java 编程思想 并发_java编程思想-java中的并发(一)
- JavaSE学习(黑马程序员徐磊老师)day01
- 美观大气的PHP网站统计访客分析和会话跟踪系统
热门文章
- “雪人计划“IPV6根服务器全球分布情况
- 个人永久性免费-Excel催化剂功能第17波-批量文件改名、下载、文件夹创建等
- 加菲猫卡丁车:激情竞速 Mac(卡通赛车竞速游戏)原生版
- 中国高级自动驾驶产业发展六大趋势(2020-2023)
- 华住酒店泄露数据的暗网出售情况剖析
- oracle pls 00323,Error(30,13): PLS-00323: subprogram or cursor 'XXXXX' is declared in a package spec
- 寻找技术合伙人的那些坑
- App分享下载统计-你的分享是否带来了用户?
- 逆向新手,经典扫雷游戏确定雷区地址的5个方法
- 逻辑门器件,直接用二极管、三极管搭建