实验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编码相关推荐

  1. [数据压缩]_实验① bmp转yuv

    文章目录 一. 实验名称 二. 实验目的 三. 实验要求 四. 实验内容 1.典型的BMP图像文件由四部分组成: ① 位图文件头 ② 位图信息头 ③ 调色板 ④ 图像数据字节阵列 2.字节序 五. 实 ...

  2. [数据压缩]实验四 DPCM编码

    目录 一.实验框架 1.分析并实践DPCM压缩系统 2.掌握DPCM编解码系统原理,使用编程语言实现DPCM编码器. 二.DPCM编解码原理 DPCM函数(附) 三.DPCM编码系统设计 PSNR函数 ...

  3. 实验四——DPCM编码(1bit、2bit、4bit、8bit量化)

    一.实验要求 本实验的目标是验证DPCM编码的编码效率.首先读取一个256级的灰度图像,采用自己设定的预测方法计算预测误差(本次实验报告使用左向预测),并对预测误差进行8比特均匀量化(基本要求).还可 ...

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

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

  5. 使用C++实现DPCM编码(左向预测8bit、4bit、2bit、1bit和上向预测8bit)(更新过)

    使用C++实现DPCM编码(左向预测8bit.4bit.2bit.1bit和上向预测8bit) 一.DPCM是什么? 二.使用C++实现DPCM编码(左向预测8bit.4bit.2bit.1bit和上 ...

  6. dpcm matlab,matlab实现DPCM编码和游长编码

    实验2:编码解码 使用matlab实现对lena灰度图像和二值图像的DPCM编码和解码,以及游长编码的实现. 在进行编码之前,首先应该理解两种编码方式的原理.过程,梳理好之后再落实到代码上. 将图片的 ...

  7. java文件加密解密实验报告_《网络信息安全技术》_实验报告_破译vigenamp#232;re_密码加密的密文...

    <<网络信息安全技术>_实验报告_破译vigen&amp#232;re_密码加密的密文>由会员分享,可在线阅读,更多相关<<网络信息安全技术>_实验报 ...

  8. 6.1 Python图像处理之图像编码技术和标准-DPCM编码

    6.1 Python图像处理之图像编码技术和标准-DPCM编码 文章目录 6.1 Python图像处理之图像编码技术和标准-DPCM编码 1 算法原理 2 代码 3 效果 1 算法原理 预测编码利用的 ...

  9. DPCM编码算法实现

    目录 一.DPCM编解码原理 二.DPCM编码系统设计 三.算法实现 1.代码 2.运行结果 3.结果分析 一.DPCM编解码原理 DPCM是差分预测编码调制的缩写,是比较典型的预测编码系统.在DPC ...

最新文章

  1. PyTorch学习笔记(二)——回归
  2. 如何做自己的服务监控?spring boot 2.x服务监控揭秘
  3. LaTex:算法排版
  4. linux内存free低,Linux上的内存使用情况与`free`不匹配
  5. 利用java实现的一个发送手机短信的小例子
  6. 360手柄摇杆漂移修复_彻底解决你的Switch手柄摇杆问题,最省钱的完美修复。
  7. 在 Xcode 中进行自动化测试 (2/2)
  8. python访问注册表_Python 操作注册表
  9. jQuery插件之ajaxFileUpload异步上传
  10. Linux系统管理员应该知道的20个系统监控工具
  11. FineReport.10 一(帆软)(报表基础练习)
  12. 蓝桥杯单片机组经验分享之(三)各模块用法(1)138译码器
  13. 黑马 docker 学习笔记
  14. mysql函数百分比_mysql window函数计算百分比
  15. mac 重启 ssh 服务
  16. 共享软件作者怎样才能月入万元(一)
  17. SpringSecurity(二)、权限项目框架搭建
  18. JS将GMT时间转化为当前时区时间
  19. MATLAB中强行终止执行程序的4种方法
  20. 移动端 - APP测试要点

热门文章

  1. Java简简单单抢红包小程序(代码)
  2. MMA-mathematica数值求解非线性偏微分方程组
  3. 前端不让浏览器自动填充账号密码
  4. win10给扩展屏设置单独的壁纸(win10自带这个功能)
  5. win10多显示器设置只有主显示屏显示任务栏
  6. IntelliJ IDEA 13 皮肤/编辑器字体设置
  7. 今日新出 CV 论文汇总(含医学图像、目标检测、唇语识别、SLAM等)
  8. 2023-spring 2.探险营地 — 字符串
  9. tesseract第三方图文验证码识别用法
  10. 苹果iOS证书制作教程