目录

实验目的

实验原理

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是一种无失真信源编码算法,主要目的是根据使用频率来最大化节省字符(编码)的存储空间,编码后可以得到即时的最佳码。

[具体的实现算法]

  1. 统计符号的发生概率
  2. 把频率暗从小到大的顺序排列
  3. 每一次选出最小的两个值,作为二叉树的两个叶子节点,将和作为它们的根节点,这两个叶子节点不再参与比较,新的根节点参与比较。
  4. 重复3,直到最后得到和为1的根节点。
  5. 将形成的二叉树的左节点标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压缩系统的实现和分析相关推荐

  1. [数据压缩作业6]DPCM压缩系统的实现和分析

    目录 (一)实验名称 (二)实验目的 (三)主要设备 (四)实验内容 一.原理 1. DPCM编解码 2. PSNR峰值信号噪声比 (五)实验步骤 一.DPCM编码系统的设计 二.代码 1. DPCM ...

  2. Lab4 DPCM 压缩系统的实现和分析——C语言代码实现

    Lab4 DPCM 压缩系统的实现和分析--C语言代码实现 一.实验原理 原理实现框图如下: 将输入的像素值与前一个像素值的预测值作差,并对差值进行编码 编码后的差值一路直接输出 编码后的差值另一路通 ...

  3. 数据压缩【实验四】DPCM压缩系统的实现和分析

    目录 一.实验目的 二.实验原理 三. 实验代码 (1)代码 (2)输出结果 四.实验结果 (1)压缩 (2) PSNR峰值信噪比 原理 算法 重建图像 五.实验分析 一.实验目的 掌握DPCM编解码 ...

  4. DPCM压缩系统的实现与分析

    目录 一.实验目的 二.实验原理 1.DPCM编解码原理 2.PSNR峰值信噪比 三.实验步骤 四.实验代码 1.DPCM 2.PSNR 3.主函数 五.实验结果与分析 1.压缩质量 以下图为例 其他 ...

  5. [实验四]DPCM 压缩系统的实现和分析

    目录 一.实验原理 1.1 DPCM ​1.2 量化 二.代码实现 2.1 程序说明 2.2 main.cpp 2.3 DPCM.h 2.4 DPCM.cpp 2.5 UV通道删除 三.实验测试 四. ...

  6. 数据压缩(8):DPCM 压缩系统的实现和分析

    1.DPCM编解码原理 DPCM是差分预测编码调制的缩写,是比较典型的预测编码系统.在DPCM系统中,需要注意的是预测器的输入是已经解码以后的样本.之所以不用原始样本来做预测,是因为在解码端无法得到原 ...

  7. DPCM 压缩系统的实现和分析

    DPCM基本原理 DPCM即查分预测编码调制,将一个像素与上一个像素的差量化,得到预测误差. 本实验中采用右侧减左侧得到差值来预测,量化器采用8比特均匀量化. 编码代码 /* y_buffer:存储y ...

  8. matlab 性能分析方法,DPCM,PSK系统的MATLAB实现及性能分析

    DPCM/PSK系统的MATLAB实现及 性能分析 学生姓名:指导老师: 摘要:本课程设计主要是为了进一步理解DPCM编码解码和PSK调制解调原理,并能通过MATLAB系统软件来实现对DPCM编码解码 ...

  9. Linux内核文件vmlinux 和压缩后的bzImage文件格式分析

    Linux内核文件vmlinux 和压缩后的bzImage文件格式分析 ================= 1. 需要使用的命令 ================ readelf    -- 显示el ...

最新文章

  1. 堆,栈,内存泄露,内存溢出介绍
  2. Web系统中Mic设备的应用实例
  3. anglarjs引入HTML头,请问怎么在html引入angularjs?
  4. 天池项目总结,特征工程了解一下!(文末送书)
  5. 计算机运行卡英语怎么说,“芯片卡”英语怎么说
  6. w7计算机的收藏夹里弄出桌面,Win7电脑桌面的便签怎么弄出来?
  7. 经典水墨素材点缀中国风海报|简约国际范
  8. python数据处理源代码_python数据分析与应用源数据和代码
  9. react视频教程百度云资源链接
  10. 新版C语言面试题面试题库(含答案)
  11. 电信天翼网关与路由器级联
  12. 2021亚洲最佳职场中国大陆区企业公布:工业富联、特斯拉等上榜;黑人牙膏将更名为好来 | 美通社头条...
  13. c语言实训报告 总结与展望,c语言实训报告总结范文四篇合集
  14. 计算机房的正常温度和湿度,什么是机房温度、湿度标准?
  15. 基于matlab 非局部均值(NLM)滤波图像去噪
  16. python二级证书含金量排名_计算机二级证书的含金量不高?别小瞧,这些优势用处不小!...
  17. Py之pyod:pyod的简介、安装、使用方法之详细攻略
  18. 建行找不到服务器或DNS错误,建行浏览器打不开,提示域名解析错误,代码105,怎么解决?谢谢...
  19. Java物联网项目中,运行SPringBoot脚手架,运行失败问题
  20. 图的深度优先算法和广度优先算法

热门文章

  1. 西门子s7 200smart与台达变频器485通讯
  2. 论网站后台管理系统的重要性
  3. 如何用excel筛选相似内容_excel如何筛选出相似的内容?
  4. spring boot+mybatis+thymeleaf+pagehelper分页插件实现分页功能
  5. Java如何获取JSON数据中的值 备忘
  6. java 7 异常新特性_Java7的异常处理新特性-addSuppressed()方法等
  7. 基于微信小程序的公务员考试刷题系统设计与实现
  8. 智能小车往复运动及控制
  9. 【MySql】CentOS7 安装并配置MySQL8.0
  10. 数据结构——树(一)