[数据压缩]_实验③ DPCM编码
实验4 DPCM压缩
文章目录
- 实验4 DPCM压缩
- 一.实验名称
- 二.实验目的
- 三.实验内容
- 1.DPCM编码原理
- 2.DPCM编码系统的设计
- 四.实验步骤
- 1.method.h头文件
- 2.main函数
- 3.dpcm函数
- 4.psnr函数
- 5. prob函数
- 五.实验结果
- 1.dpcm
- 2.熵编码
- 3.对比:
- 4.总结:
持续更改中。。。
一.实验名称
DPCM 压缩系统的实现和分析
二.实验目的
掌握DPCM编解码系统的基本原理。初步掌握实验用C/C++等语言编程实现DPCM编码器,并分析其压缩效率。
三.实验内容
1.DPCM编码原理
DPCM是差分预测编码调制的缩写,是比较典型的预测编码系统。在DPCM系统中,需要注意的是预测器的输入是已经解码以后的样本。之所以不用原始样本来做预测,是因为在解码端无法得到原始样本,只能得到存在误差的样本。因此,在DPCM编码器中实际内嵌了一个解码器,如编码器中虚线框中所示。在一个DPCM系统中,有两个因素需要设计:预测器和量化器。理想情况下,预测器和量化器应进行联合优化。实际中,采用一种次优的设计方法:分别进行线性预测器和量化器的优化设计。
2.DPCM编码系统的设计
在本次实验中,我们采用固定预测器和均匀量化器。
在DPCM编码器实现的过程中可同时输出预测误差图像和重建图像。将预测误差图像写入文件并将该文件输入Huffman编码器,得到输出码流、给出概率分布图并计算压缩比。
将原始图像文件输入Huffman编码器,得到输出码流、给出概率分布图并计算压缩比。
最后比较两种系统(1.DPCM+熵编码和2.仅进行熵编码)之间的编码效率(压缩比和图像质量)。压缩质量以PSNR进行计算。
四.实验步骤
1.method.h头文件
#pragma once
#define uchar unsigned char
void dpcm(int h, int w, uchar* origin_buf, uchar* rebuild_buf, uchar* error_buf, int Qbit);
double psnr(int h, int w, uchar* origin_buf, uchar* rebuild_buf, int Qbit);
void prob(int h, int w, uchar* input_buf, double* output_buf);
2.main函数
#define _CRT_SECURE_NO_DEPRECATE
#include<iostream>
#include<windows.h>
#include"header.h"
#define uchar unsigned char
using namespace std;int main()
{// 1.定义变量FILE* originFile = NULL;FILE* rebuildFile = NULL;FILE* errorFile = NULL;FILE* origintxt = NULL;FILE* errortxt = NULL;BITMAPINFOHEADER INFO_header;int Qbit = 2;// 2.打开文件if (fopen_s(&originFile, "Lena256B.yuv", "rb") == 0) cout << "原文件打开成功" << endl;if (fopen_s(&rebuildFile, "rebuildlena.yuv", "wb") == 0) cout << "重建文件创建成功" << endl;if (fopen_s(&errorFile, "errorlena.yuv", "wb") == 0) cout << "预测误差文件创建成功" << endl;if (fopen_s(&origintxt, "origin.txt", "wb") == 0) cout << "记录原图概率分布文件创建成功" << endl;if (fopen_s(&errortxt, "error.txt", "wb") == 0) cout << "记录预测误差的概率分布的文件创建成功" << endl;int height = 256;int weight = 256;// 3.开缓冲uchar* y_buffer = new uchar[weight * height];uchar* u_buffer = new uchar[(weight * height) / 4];uchar* v_buffer = new uchar[(weight * height) / 4];//uchar* y_buffer = (uchar*)malloc(sizeof(weight * height)*1.5);uchar* rebuild_buf = new uchar [height * weight];uchar* error_buf = new uchar[height * weight];double* origin_prob = new double[256];double* error_prob = new double[256];// 4.读取文件到bufferfread(y_buffer, sizeof(uchar), height * weight, originFile);fread(u_buffer, sizeof(uchar), (weight * height) / 4, originFile);fread(v_buffer, sizeof(uchar), (weight * height) / 4, originFile);// 5.dpcmdpcm(height, weight, y_buffer, rebuild_buf, error_buf,Qbit);// 6.psnrpsnr(height, weight, y_buffer, rebuild_buf, Qbit);// 7.统计概率分布prob(height, weight, y_buffer, origin_prob);prob(height, weight, error_buf, error_prob);// 8.写入文件fwrite(rebuild_buf, sizeof(uchar), height * weight, rebuildFile);fwrite(u_buffer, sizeof(uchar), height * weight / 4, rebuildFile);fwrite(v_buffer, sizeof(uchar), height * weight / 4, rebuildFile);fwrite(error_buf, sizeof(uchar), height * weight, errorFile);fwrite(u_buffer, sizeof(uchar), height * weight / 4, errorFile);fwrite(v_buffer, sizeof(uchar), height * weight / 4, errorFile);// 概率分布写进txt中for (int i = 0; i < 256; i++){fprintf(origintxt, "%lf\n", *(origin_prob + i));fprintf(errortxt, "%lf\n", *(error_prob + i));}// 9.关闭文件fclose(originFile);fclose(rebuildFile);fclose(errorFile);fclose(origintxt);fclose(errortxt);delete[] y_buffer;delete[] u_buffer;delete[] v_buffer;delete[] rebuild_buf;delete[] error_buf;delete[] origin_prob;delete[] error_prob;return 0;
}
3.dpcm函数
采用左向预测,第一列像素的误差值设为128.
预测误差图像:当前值-前一个像素的重建值
e ( n ) = y ( n ) − r e ( n − 1 ) − − − 预 测 误 差 e(n)=y(n)-re(n-1)---预测误差 e(n)=y(n)−re(n−1)−−−预测误差
e ^ ( n ) = e ( n ) + 255
[数据压缩]_实验③ DPCM编码相关推荐
- [数据压缩]_实验① bmp转yuv
文章目录 一. 实验名称 二. 实验目的 三. 实验要求 四. 实验内容 1.典型的BMP图像文件由四部分组成: ① 位图文件头 ② 位图信息头 ③ 调色板 ④ 图像数据字节阵列 2.字节序 五. 实 ...
- [数据压缩]实验四 DPCM编码
目录 一.实验框架 1.分析并实践DPCM压缩系统 2.掌握DPCM编解码系统原理,使用编程语言实现DPCM编码器. 二.DPCM编解码原理 DPCM函数(附) 三.DPCM编码系统设计 PSNR函数 ...
- 实验四——DPCM编码(1bit、2bit、4bit、8bit量化)
一.实验要求 本实验的目标是验证DPCM编码的编码效率.首先读取一个256级的灰度图像,采用自己设定的预测方法计算预测误差(本次实验报告使用左向预测),并对预测误差进行8比特均匀量化(基本要求).还可 ...
- 数据压缩【实验四】DPCM压缩系统的实现和分析
目录 一.实验目的 二.实验原理 三. 实验代码 (1)代码 (2)输出结果 四.实验结果 (1)压缩 (2) PSNR峰值信噪比 原理 算法 重建图像 五.实验分析 一.实验目的 掌握DPCM编解码 ...
- 使用C++实现DPCM编码(左向预测8bit、4bit、2bit、1bit和上向预测8bit)(更新过)
使用C++实现DPCM编码(左向预测8bit.4bit.2bit.1bit和上向预测8bit) 一.DPCM是什么? 二.使用C++实现DPCM编码(左向预测8bit.4bit.2bit.1bit和上 ...
- dpcm matlab,matlab实现DPCM编码和游长编码
实验2:编码解码 使用matlab实现对lena灰度图像和二值图像的DPCM编码和解码,以及游长编码的实现. 在进行编码之前,首先应该理解两种编码方式的原理.过程,梳理好之后再落实到代码上. 将图片的 ...
- java文件加密解密实验报告_《网络信息安全技术》_实验报告_破译vigenamp#232;re_密码加密的密文...
<<网络信息安全技术>_实验报告_破译vigen&#232;re_密码加密的密文>由会员分享,可在线阅读,更多相关<<网络信息安全技术>_实验报 ...
- 6.1 Python图像处理之图像编码技术和标准-DPCM编码
6.1 Python图像处理之图像编码技术和标准-DPCM编码 文章目录 6.1 Python图像处理之图像编码技术和标准-DPCM编码 1 算法原理 2 代码 3 效果 1 算法原理 预测编码利用的 ...
- DPCM编码算法实现
目录 一.DPCM编解码原理 二.DPCM编码系统设计 三.算法实现 1.代码 2.运行结果 3.结果分析 一.DPCM编解码原理 DPCM是差分预测编码调制的缩写,是比较典型的预测编码系统.在DPC ...
最新文章
- PyTorch学习笔记(二)——回归
- 如何做自己的服务监控?spring boot 2.x服务监控揭秘
- LaTex:算法排版
- linux内存free低,Linux上的内存使用情况与`free`不匹配
- 利用java实现的一个发送手机短信的小例子
- 360手柄摇杆漂移修复_彻底解决你的Switch手柄摇杆问题,最省钱的完美修复。
- 在 Xcode 中进行自动化测试 (2/2)
- python访问注册表_Python 操作注册表
- jQuery插件之ajaxFileUpload异步上传
- Linux系统管理员应该知道的20个系统监控工具
- FineReport.10 一(帆软)(报表基础练习)
- 蓝桥杯单片机组经验分享之(三)各模块用法(1)138译码器
- 黑马 docker 学习笔记
- mysql函数百分比_mysql window函数计算百分比
- mac 重启 ssh 服务
- 共享软件作者怎样才能月入万元(一)
- SpringSecurity(二)、权限项目框架搭建
- JS将GMT时间转化为当前时区时间
- MATLAB中强行终止执行程序的4种方法
- 移动端 - APP测试要点