DPCM压缩系统的实现和分析
目录
实验目的
实验原理
DPCM编解码原理
线性预测器的设计
图像客观质量评价
均方误差
信噪比SNR
峰值信噪比PSNR
Huffman编码
代码
dpcm.h
DPCM.cpp
frequence.cpp
main.cpp
设置属性页
实验结果
Huffman编码
总结
实验目的
掌握DPCM编解码系统的基本原理。初步掌握实验用C/C++/Python等语言编程实现DPCM编码器,并分析其压缩效率。
实验原理
DPCM编解码原理
DPCM是差分预测编码调制的缩写,是比较典型的预测编码系统。在DPCM系统中,需要注意的是预测器的输入是已经解码以后的样本。之所以不用原始样本来做预测,是因为在解码端无法得到原始样本,只能得到存在误差的样本。因此,在DPCM编码器中实际内嵌了一个解码器,如编码器中虚线框中所示。在一个DPCM系统中,有两个因素需要设计:预测器和量化器。理想情况下,预测器和量化器应进行联合优化。实际中,采用一种次优的设计方法:分别进行线性预测器和量化器的优化设计。在这种方法中,量化电平数必须足够大(M>=8)才能获得很好的性能。
信噪比:
其中:为量化误差的均方值,
为预测误差的均方值。
预测误差为:
预测误差的方差为:
若用MSE(
均方误差)作为失真度量,这最小化失真的最佳预测器为:
(若采用前N个样本预测。且每个样本为B比特,则上述条件概率需要有一个项的表。)
线性预测器的设计
设计目标:具有最小均方误差的预测器-最大的预测增益,即在最小的条件下确定一组最佳预测系数(略去量化误差)。
图像客观质量评价
均方误差
e(t)为 原始波形与重建波形直插,
为误差均值通常为零。
使均方误差MSE最小的编码器设计方法称为最小均方误差(MMSE)设计。(
,
是取样后的信号)最为信号质量的客观评判标准和MMSE的设计准则。
信噪比SNR
(信号方差与重建误差方差的比值)
由于按照离散图像场计算简便,SNR公式也可以写作:
峰值信噪比PSNR
因为图像幅度的均值通常为非零整数,因而将SNR式子中,用x(m,n)的最大值来代替均方根值,得到峰值信噪比
。
Huffman编码
Huffman是一种无失真信源编码算法,主要目的是根据使用频率来最大化节省字符(编码)的存储空间,编码后可以得到即时的最佳码。
[具体的实现算法]
- 统计符号的发生概率
- 把频率暗从小到大的顺序排列
- 每一次选出最小的两个值,作为二叉树的两个叶子节点,将和作为它们的根节点,这两个叶子节点不再参与比较,新的根节点参与比较。
- 重复3,直到最后得到和为1的根节点。
- 将形成的二叉树的左节点标0,右节点标1,把从最上面的根节点到最下面的叶子节点途中遇到的0,1序列串起来,就得到了各个符号的编码。
产生霍夫曼编码需要对原始数据扫描两遍,第一遍扫描要精确地统计出原始数据中,每个值出现的频率,第二遍是建立霍夫曼树并进行编码,由于需要建立二叉树并遍历二叉树生成编码,因此数据压缩和还原速度都较慢,但简单有效,因而得到广泛的应用。
代码
dpcm.h
#pragma oncevoid frequency(int num, unsigned char* y, double* fre);
void DPCM(int H, int W, unsigned char* y_in, unsigned char* diff_in, unsigned char* re_in, int Nbit);
DPCM.cpp
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <math.h>#define u_int8_t unsigned __int8 //1个字节
#define u_int unsigned __int32 //4个字节
#define u_int32_t unsigned __int32
#define FALSE false
#define TRUE true/**********定义bcpm变量及缓存***************/
FILE* qFile = NULL;//输出的预测误差图
FILE* dFile = NULL;//输出的重建图
char* qFileName = NULL;//预测误差图文件名
char* dFileName = NULL;//重建图文件名
float qn;//差值
u_int8_t* qBuf = NULL;//预测误差
u_int8_t* dBuf = NULL;//解码值void DPCM(int H, int W, unsigned char* y_in, unsigned char* diff_in, unsigned char* re_in, int Nbit)
{int i, j;unsigned char* y, * re;char* diff;y = (unsigned char*)y_in;//原始图像diff = (char*)diff_in;//误差re = (unsigned char*)re_in;//预测图像int N = pow(2, Nbit);//量化电平数int step = 512 / N;//量化间隔int c;int iq, q;for (i = 0; i < H; i++){for (j = 0; j < W; j++){//第一列像素if (j == 0){c = y[i * W + j] - 128;diff[i * W + j] = c + 128;q = (int)((c + 255) / step + 0.5);//量化iq = (int)(q * step + 0.5 - 255);//反量化re[i * W + j] = iq + 128;//重建电平}else{c = y[i * W + j] - re[i * W + j - 1];diff[i * W + j] = c + 128;q = (int)((c + 255) / step + 0.5);//量化iq = (int)(q * step + 0.5 - 255);//反量化re[i * W + j] = iq + re[i * W + j - 1];//重建电平}//限制重建电平范围if (re[i * W + j] > 255)re[i * W + j] = 255;if (re[i * W + j] < 0)re[i * W + j] = 0;}}
}
frequence.cpp
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
#include<malloc.h>void frequency(int num, unsigned char* y, double* fre)
{for (int i = 0; i < 256; i++){fre[i] = 0;for (int j = 0; j < num; j++){if (y[j] == i)fre[i] += 1;}fre[i] = fre[i] / num;}
}
main.cpp
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
#include<malloc.h>
#include"dpcm.h"int Width = 768;
int Height = 512;
int N = 2; //量化比特数int main(int argc, char** argv)
{FILE* srcFile;FILE* errFile;FILE* recFile;FILE* fre1File;FILE* fre2File;FILE* fre3File;char* srcFileName = NULL;char* errFileName = NULL;char* recFileName = NULL;char* fre1FileName = NULL;char* fre2FileName = NULL;char* fre3FileName = NULL;srcFileName = argv[1]; //原图yuverrFileName = argv[2]; //预测误差图yuvrecFileName = argv[3]; //重建图yuvfre1FileName = argv[4]; //原始图像频率分布txtfre2FileName = argv[5]; //重建图像频率分布txtfre3FileName = argv[6]; //预测误差图像频率分布txtunsigned char* y, * u, * v, * re, * err;double* fre1, * fre2, * fre3;double MSE = 0, PSNR = 0;//分配缓冲区fre1 = (double*)malloc(sizeof(double) * 256);fre2 = (double*)malloc(sizeof(double) * 256);fre3 = (double*)malloc(sizeof(double) * 256);y = (unsigned char*)malloc(sizeof(char) * (Width * Height));u = (unsigned char*)malloc(sizeof(char) * (Width * Height) / 4);v = (unsigned char*)malloc(sizeof(char) * (Width * Height) / 4);re = (unsigned char*)malloc(sizeof(char) * (Width * Height));err = (unsigned char*)malloc(sizeof(char) * (Width * Height));//打开文件fopen_s(&srcFile, srcFileName, "rb");fopen_s(&errFile, errFileName, "wb");fopen_s(&recFile, recFileName, "wb");fopen_s(&fre1File, fre1FileName, "wb");fopen_s(&fre2File, fre2FileName, "wb");fopen_s(&fre3File, fre3FileName, "wb");fread(y, 1, Width * Height, srcFile);fread(u, 1, Width * Height / 4, srcFile);fread(v, 1, Width * Height / 4, srcFile);//调用DPCMDPCM(Height, Width, y, err, re, N);//计算频率frequency(Width * Height, y, fre1);frequency(Width * Height, re, fre2);frequency(Width * Height, err, fre3);//计算SME和PSNRint i;for (i = 0; i < Width * Height; i++){MSE = MSE + pow((y[i] - re[i]), 2);}MSE = MSE / (Width * Height);PSNR = 10 * log10((255 * 255) / MSE);printf("N: %d\n", N);printf("MSE is %lf\n", MSE);printf("PSNR is %lf\n", PSNR);//写入重建图像fwrite(re, 1, (Width * Height), recFile);fwrite(u, 1, (Width * Height) / 4, recFile);fwrite(v, 1, (Width * Height) / 4, recFile);//写入预测误差图像fwrite(err, 1, (Width * Height), errFile);fwrite(u, 1, (Width * Height) / 4, errFile);fwrite(v, 1, (Width * Height) / 4, errFile);//输出原始图像频率分布fprintf(fre1File, "value frequency\n");for (i = 0; i < 256; i++){fprintf(fre1File, "%lf\n", fre1[i]);}//输出重建图像频率分布fprintf(fre2File, "value frequency\n");for (i = 0; i < 256; i++){fprintf(fre2File, "%lf\n", fre2[i]);}//输出预测误差图像频率分布fprintf(fre3File, "value frequency\n");for (i = 0; i < 256; i++){fprintf(fre3File, "%lf\n", fre3[i]);}fclose(srcFile);fclose(errFile);fclose(recFile);fclose(fre1File);fclose(fre2File);fclose(fre3File);free(y);free(u);free(v);free(err);free(re);return 0;
}
设置属性页
实验结果
原图
原图像频率分布图
8bit | 4bit | 2bit | |
MSE | 0.434489 | 322.919492 | 6933.211016 |
PSNR | 51.751010 | 23.039861 | 9.721459 |
重建图 |
![]() |
![]() |
![]() |
预测误差图 |
![]() |
![]() |
![]() |
重建图频率分布 |
![]() |
![]() |
![]() |
预测误差频率分布 |
![]() |
![]() |
![]() |
Huffman编码
使用Huffman编码器将预测误差图像输入,生成huff文件
编码方式 | 压缩比 |
仅熵编码 | 576/523=1.101 |
8bit+熵编码 | 576/382=1.508 |
4bit+熵编码 | 576/452=1.274 |
2bit+熵编码 | 576/536=1.075 |
总结
可见,8bit量化下,经过DPCM+熵编码后的图像压缩比最大,压缩效率最高。其次是4bit>熵编码>2bit;
压缩质量8bit>4bit>2bit
DPCM压缩系统的实现和分析相关推荐
- [数据压缩作业6]DPCM压缩系统的实现和分析
目录 (一)实验名称 (二)实验目的 (三)主要设备 (四)实验内容 一.原理 1. DPCM编解码 2. PSNR峰值信号噪声比 (五)实验步骤 一.DPCM编码系统的设计 二.代码 1. DPCM ...
- Lab4 DPCM 压缩系统的实现和分析——C语言代码实现
Lab4 DPCM 压缩系统的实现和分析--C语言代码实现 一.实验原理 原理实现框图如下: 将输入的像素值与前一个像素值的预测值作差,并对差值进行编码 编码后的差值一路直接输出 编码后的差值另一路通 ...
- 数据压缩【实验四】DPCM压缩系统的实现和分析
目录 一.实验目的 二.实验原理 三. 实验代码 (1)代码 (2)输出结果 四.实验结果 (1)压缩 (2) PSNR峰值信噪比 原理 算法 重建图像 五.实验分析 一.实验目的 掌握DPCM编解码 ...
- DPCM压缩系统的实现与分析
目录 一.实验目的 二.实验原理 1.DPCM编解码原理 2.PSNR峰值信噪比 三.实验步骤 四.实验代码 1.DPCM 2.PSNR 3.主函数 五.实验结果与分析 1.压缩质量 以下图为例 其他 ...
- [实验四]DPCM 压缩系统的实现和分析
目录 一.实验原理 1.1 DPCM 1.2 量化 二.代码实现 2.1 程序说明 2.2 main.cpp 2.3 DPCM.h 2.4 DPCM.cpp 2.5 UV通道删除 三.实验测试 四. ...
- 数据压缩(8):DPCM 压缩系统的实现和分析
1.DPCM编解码原理 DPCM是差分预测编码调制的缩写,是比较典型的预测编码系统.在DPCM系统中,需要注意的是预测器的输入是已经解码以后的样本.之所以不用原始样本来做预测,是因为在解码端无法得到原 ...
- DPCM 压缩系统的实现和分析
DPCM基本原理 DPCM即查分预测编码调制,将一个像素与上一个像素的差量化,得到预测误差. 本实验中采用右侧减左侧得到差值来预测,量化器采用8比特均匀量化. 编码代码 /* y_buffer:存储y ...
- matlab 性能分析方法,DPCM,PSK系统的MATLAB实现及性能分析
DPCM/PSK系统的MATLAB实现及 性能分析 学生姓名:指导老师: 摘要:本课程设计主要是为了进一步理解DPCM编码解码和PSK调制解调原理,并能通过MATLAB系统软件来实现对DPCM编码解码 ...
- Linux内核文件vmlinux 和压缩后的bzImage文件格式分析
Linux内核文件vmlinux 和压缩后的bzImage文件格式分析 ================= 1. 需要使用的命令 ================ readelf -- 显示el ...
最新文章
- 堆,栈,内存泄露,内存溢出介绍
- Web系统中Mic设备的应用实例
- anglarjs引入HTML头,请问怎么在html引入angularjs?
- 天池项目总结,特征工程了解一下!(文末送书)
- 计算机运行卡英语怎么说,“芯片卡”英语怎么说
- w7计算机的收藏夹里弄出桌面,Win7电脑桌面的便签怎么弄出来?
- 经典水墨素材点缀中国风海报|简约国际范
- python数据处理源代码_python数据分析与应用源数据和代码
- react视频教程百度云资源链接
- 新版C语言面试题面试题库(含答案)
- 电信天翼网关与路由器级联
- 2021亚洲最佳职场中国大陆区企业公布:工业富联、特斯拉等上榜;黑人牙膏将更名为好来 | 美通社头条...
- c语言实训报告 总结与展望,c语言实训报告总结范文四篇合集
- 计算机房的正常温度和湿度,什么是机房温度、湿度标准?
- 基于matlab 非局部均值(NLM)滤波图像去噪
- python二级证书含金量排名_计算机二级证书的含金量不高?别小瞧,这些优势用处不小!...
- Py之pyod:pyod的简介、安装、使用方法之详细攻略
- 建行找不到服务器或DNS错误,建行浏览器打不开,提示域名解析错误,代码105,怎么解决?谢谢...
- Java物联网项目中,运行SPringBoot脚手架,运行失败问题
- 图的深度优先算法和广度优先算法
热门文章
- 西门子s7 200smart与台达变频器485通讯
- 论网站后台管理系统的重要性
- 如何用excel筛选相似内容_excel如何筛选出相似的内容?
- spring boot+mybatis+thymeleaf+pagehelper分页插件实现分页功能
- Java如何获取JSON数据中的值 备忘
- java 7 异常新特性_Java7的异常处理新特性-addSuppressed()方法等
- 基于微信小程序的公务员考试刷题系统设计与实现
- 智能小车往复运动及控制
- 【MySql】CentOS7 安装并配置MySQL8.0
- 数据结构——树(一)