DPCM差分预测编码实验报告

DPCM编码实验报告 DPCM编解码原理 DPCM是差分预测编码调制的缩写,是比较典型的预测编码系统。在DPCM系统中, 需要注意的是预测器的输入是已经解码以后的样本。之所以不用原始样本来做预测,是因为在解码端无法得到原始样本,只能得到存在误差的样本。因此,在DPCM编码器中实际内嵌了一个解码器,如编码器中虚线框中所示。 在一个DPCM系统中,有两个因素需要设计:预测器和量化器。理想情况下,预测器和量化器应进行联合优化。实际中,采用一种次优的设计方法:分别进行线性预测器和量化器的优化设计。 DPCM编码系统的设计 在本次实验中 阅读详情

DPCM

原理

在这里插入图片描述
如图所示,首先输入一个图像,与上一个图像的预测值做差,将差值进行编码。
编码后的差值有两个去向,一是直接输出,二是通过解码器反解出差值,与上一帧的预测值相加,就得到了当前图像的预测值,为下一帧图像到来时做好准备。

实现功能

本次采用左侧预测,并且默认最左侧像素前的真实值为均为128。并且实现了如下功能:

  • 进行不同量化bit数的差分预测编码
  • 将编码结果进行输出并进行霍夫曼编码
  • 分别计算原图像和量化后的图像进行概率分布
  • 分别计算原图像经过熵编码和经过DPCM+熵编码的图像的压缩比
  • 比较二者压缩效率
  • 计算重建图像的PSNR

代码

#include <iostream>
#include <fstream>
#include <cmath>

using namespace std;
const string inPath = "seed.yuv";
const int maxn = 1E5 + 5;
const int maxV = 255, N = 256;

int height = 500, width = 500;
unsigned char *yBuffer, *rebuild, *predict, *tmp, *code;
int bitNum; double delta;
unsigned char limit( int val )
{
    if( val > 255 ) return 255;
    if( val < 0 ) return 0;
    return val;
}
//量化
unsigned char Q( int val )
{
    val += 255;
    int ans = val / delta;
    if( ans == (1 << bitNum) ) ans --;
    return ans;
}
//反量化
int deQ( unsigned char val )
{
    int ans = (val + 0.5)* delta + 0.5;
    ans -= 255;
    if( ans > 255 ) ans = 255;
    return ans;
}
//计算PSNR
double PSNR( unsigned char* standard, unsigned char* image )
{
    double psnr = 0, MSE = 0;
    for( int i = 0; i < height * width; ++ i ) MSE += 1ll* (image[i] - standard[i]) * (image[i] - standard[i]);
    MSE /= height * width;
    long long t = 1 << bitNum; t -= 1; t *= t;
    psnr = 10 * log10( t / MSE);
    return psnr;
}
//得到频率分布
void GetFrequency( unsigned char* buffer, double* frequency )
{
    int length = height * width;
    for( int i = 0; i < length; ++ i ) frequency[buffer[i]] ++;
    for( int i = 0; i < N; ++ i ) frequency[i] /= length;
}

int main()
{

    {
        int length = height * width;
        ifstream in( inPath, ios::binary );
        yBuffer = new unsigned char[length];
        rebuild = new unsigned char[length];
        predict = new unsigned char[length];
        code = new unsigned char[length];
        tmp = new unsigned char[length];
        in.read(( char * ) yBuffer, length );
        in.read(( char * ) tmp, length );
        //获得原图像的概率分布
        ofstream out;
        out.open(inPath + ".csv", ios::out);
        double num[N] = {0};
        GetFrequency( yBuffer, num );
        for( int i = 0; i < N; ++ i )
            out << i << "," << num[i] << endl;
        out.close();
        //进行不同bit数的差分脉冲编码
        for ( auto i : { 1, 2, 4, 8 } )
        {
            bitNum = i;
            int n = 1 << bitNum;
            delta = 1.0 * ( 2 * maxV ) / n;
            for ( int h = 0; h < height; ++h )
            {
                for ( int w = 0; w < width; ++w )
                {
                    int val = 0;
                    if ( !w ) val = int( yBuffer[h * width + w] ) - 128;
                    else val = int( yBuffer[h * width + w] ) - rebuild[h * width + w - 1];
                    predict[h * width + w] = val + 128;
                    code[h * width + w] = Q( val );
                    int d = deQ( code[h * width + w] );
                    if ( !w ) rebuild[h * width + w] = d + 128;
                    else rebuild[h * width + w] = limit(d + rebuild[h * width + w - 1]);
                }
            }
            //输出结果
            string suf = "";
            suf += ( '0' + i );
            suf += "bit";
            ofstream out;
            out.open( "predict" + suf + ".yuv", ios::binary );
            out.write(( char * ) predict, length );
            out.write(( char * ) tmp, length );
            out.write(( char * ) tmp, length );
            out.close();

            out.open( "rebuild" + suf + ".yuv", ios::binary );
            out.write(( char * ) rebuild, length);
            out.write(( char * ) tmp, length );
            out.write(( char * ) tmp, length);
            out.close();

            out.open( "code" + suf + ".code", ios::binary );
            out.write((char*)code, length);
            out.close();
            //获得误差的概率分布
            double residualFre[N] = {0};
            GetFrequency( code, residualFre );
            out.open("code" + suf + ".csv", ios::out);
            for( int i = 0; i < (1 << bitNum); ++ i ) out << i << "," << residualFre[i] << endl;
            cout << i << "bit psnr: "<< PSNR( yBuffer, rebuild ) << endl;
        }

        delete[] yBuffer;
        delete[] predict;
        delete[] rebuild;
        delete[] tmp;
        in.close();
    }
    return 0;
}

实验过程

  • 通过上面的代码生成编码、预测误差图像、重建图像;计算原图及编码的概率分布,以及重建图像的PSNR

  • 利用Huffman编码程序对原图像及量化后的编码进行熵编码。
    在这里插入图片描述

  • 比较文件大小、压缩比等参数。

实验结果

此处原文件大小为500* 500 * 3 = 750,000 字节

原图像8bit量化4bit量化2bit量化1bit量化
量化误差图像在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
重建图像在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
概率分布在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
熵编码后的文件大小(Byte)252993139725517414687146871
压缩比33.7%18.6%6.90%6.25%6.25%
PSNR∞51.152928.653416.82210.8348

可见经过熵编码之后,图像的大小会减小。
经过DCMP+熵编码之后,图像大小比直接使用熵编码减小的更多,随着量化比特数的减小,压缩效率越来越高,但是变化越来越缓慢;于此同时,图像质量,也就是PSNR的值迅速恶化,重建出的图像质量越来越差,到1bit是就已经很模糊了。
综上,量化应采用合适的量化比特数,使之既不至于太影响画面,又可以达到较高的压缩效率。

DPCM差分预测编码原理及实现 数据压缩实验:DPCM编码 阅读详情

相关推荐

DPCM差分预测编码

一、实验原理 1,DPCM原理: 利用图像相邻像素之间的联系,将样值与样值的差值(预测误差)量化编码。即,用上一个样值对当前样值进行预测,上一个样值作为预测值。然后以当前样值减去预测值得到误差,将误差进行量化编码,从而提高编码效率。 2,步骤: 1)计算差值->量化->进编码器; 2)原理框图如下图所示: 二、实验代码分析 我们在第二次实验BMP2YUV的实验基础上添加一个函

Shining_CC的博客 3726

数字图像处理实验报告(二)

(2)读取一张彩色图像,转换为灰度图,fspecial及imfilter函数实现多种模糊,包括运动模糊、圆盘状模糊、钝化模糊,并在一个figure窗口同时展示,标题分别为“原图”、“运动模糊”、“圆盘状模糊”、“钝化模糊”。(1)新建一个m文件,从桌面示例图像文件夹中读取一张彩色图像,转换为灰度图,使用fspecial函数对图像进行退化处理,结果展示在同一界面,标题分别为“原图”、“灰度图”、“退化图像”。subplot(222),imshow(uint8(A0)),title('退化图像')

m0_52474147的博客 3700

Simulink中DPCM量化和编码仿真

DPCM编码与解码的介绍 DPCM是差分脉冲编码调制的简称,是一种利用信号样值之间的关联特性进行高效率波形编码的方法。当信号样值序列中邻近样值之间存在明显的关联时,那么样值的差值方差就会比样值本身的方差要小。PCM中直接传输样值本身,而在DPCM中,传输数据为样值的差值,在量化误差不变的条件下,就可以用较少的比特数来表示码字,也就提高了波形编码效率。DPCM编码与解码的仿真在Simulink中的仿真模型如图 该系统的信号发生器产生一个幅度为1,频率为1的正弦波,获得输出图像Scope1,其表达式为x=si

qq_43411654的博客 7550

差分编码解析以及FPGA实现

1、差分编码解析 绝对码bn(输入信号) 0 0 1 0 1 1 0 0 0 相当码dn-1(dn延迟后的相对码) 0(保证第一个输出就是绝对码本身) 0 0 1 1 0 1 1 1 相对码dn(输出信号) 0(输出初始值是绝对码) 0 1 1 0 ...

Serve it 1万+

matlab实现DPCM编码和游长编码

实验2:编码解码   一、问题描述   使用matlab实现对lena灰度图像和二值图像的DPCM编码和解码,以及游长编码的实现。   二、问题分析 在进行编码之前,首先应该理解两种编码方式的原理、过程,梳理好之后再落实到代码上。 将图片的像素当做信号,一张图片可以转化为一个一维的信号流,从而利用两种编码方式进行压缩。 三、算法分析 DPCM 差分脉冲编码调制简称差值编码,是

Something and Nothing 8147

通信工程学习:什么是PCM脉冲编码调制、DPCM差分脉冲编码调制、ADPCM自适应差分脉冲编码调制

PCM、DPCM和ADPCM是三种主流的音频编码技术。PCM通过抽样、量化和编码实现无损数字化,数据量大但音质高;DPCM采用差分编码记录样本间差值,压缩数据但可能产生误差累积;ADPCM在DPCM基础上引入自适应量化,动态调整量化阶大小,实现更高压缩比同时保持音质。三者各具特点,适用于不同场景:PCM适合高质量音频存储,DPCM和ADPCM则更适用于需要数据压缩的传输应用。

limengshi138392的博客 2612

通信原理与MATLAB(九):DPSK的调制解调

通信原理和MATLAB

菜yuan~的博客 2万+

MATLAB实现DPCM预测编码压缩技术

差分脉冲编码调制(DPCM)是一种广泛应用于数字信号处理领域的编码技术,它通过预测信号的下一个值,并仅对预测误差进行编码来实现数据压缩。与传统的脉冲编码调制(PCM)相比,DPCM在相同的信号质量下能够获得更高的数据压缩比。MATLAB是一个集数值计算、可视化及编程于一体的高级技术计算语言和交互式环境。它由MathWorks公司开发,广泛应用于工程计算、控制系统、信号处理、图像处理等领域。MATLAB提供了强大的工具箱,针对不同的工程问题,有专门的工具箱支持。

weixin_28939623的博客 878

实验报告4_DPCM压缩系统的实现和分析

一.实验原理     DPCM是差分预测编码调制的缩写,是比较典型的预测编码系统。     在预测编码中,每个抽样值不是独立的编码,而是先根据前几个抽样值计算出一个预测值,再取当前抽样值和预测值之差,将此差值编码并传输,此差值称为预测误差。由于抽样值和预测值之间有较强的相关性,即抽样值和预测值非常接近,使此预测误差的可能取值范围比抽样值的变化范围小,所以可以少用几位编码比特来对预测误差编码,从

qq_36315119的博客 506

2DPSK实验报告

关于2DPSK实验的各个步骤都有,以及每一个步骤的结果,如眼图等波形

多媒体通信实验报告《达芬奇双核开发板下的音频编解码》

本实验是利用C语言在LINUX平台上,同时利用达芬奇双核音视频开发板实现对音频的采集,编码,解码,回放等功能。其中用到了G.711和差分编码算法。

DPCM预测编码

数据压缩实验DPCM

BeatriceDluberry的博客 2827

DPCM的基本原理,DPCM就是通过预测和差分编码方式来减少冗余,实现数据压缩的目的

DPCM的基本原理 任何信号,不论语音或图像,采用直接采样-量化-编码的方式进行编码,都会发现码组之间具有很强的相关性。由于相关性的存在,传输数据中存在大量不需要传输的信息,称为冗余。 DPCM就是通过预测和差分编码方式来减少冗余,实现数据压缩的目的。

DPCM差分编码

差分编码思想 差分编码利用了图像文件前后像素数值大概率相似极小概率跳变的特点

weixin_43416015的博客 2951

图像的线性预测编码 matlab

帧内DPCM的编解码方法(预测、量化)及其压缩性能。 一维前值预测DPCM编解码程序,预测系数取(1,0,0,0) 二维前值预测DPCM编解码程序,预测系数取(1/2,1/4,0,1/4) 本实验采用15个量化分层的主观量化器,其量化电平分别取(0,±5,±7,±10,±17,±28,±39,±52,±67)。

Godot4 TileMap分层绘制全攻略:解决角色、树木遮挡混乱,打造正确视觉层级

本文详细介绍了Godot4 TileMap分层绘制技术,通过图层管理和Y-Sort功能解决2D游戏中角色与物体的遮挡问题。从基础图层设置到高级优化策略,帮助开发者打造符合自然视觉规律的场景层次,提升游戏沉浸感。特别针对TileMap和TileSet的使用提供了实用技巧和代码示例。

weixin_28717411的博客 512

DPCM编码

一.实验原理 1.DPCM编解码原理 DPCM是差分预测编码调制的缩写,是比较典型的预测编码系统。在DPCM系统中,需要注意的是预测器的输入是已经解码以后的样本。之所以不用原始样本来做预测,是因为在解码端无法得到原始样本,只能得到存在误差的样本。因此,在DPCM编码器中实际内嵌了一个解码器,如下图编码器中虚线框中所示。 2.均匀量化 除最外两个区间趋于无穷外,均匀量化的量化区间大小

lr__by的博客 7892

STDP实战:用PyTorch从零搭建脉冲神经网络(附完整代码)

本文提供了基于PyTorch从零搭建脉冲神经网络的实战教程,重点讲解了STDP学习规则的原理与工程实现。通过构建LIF神经元模型和向量化STDP层,并结合泊松编码,详细演示了如何构建一个能够进行无监督特征学习的混合网络架构,为探索神经形态计算和低功耗实时学习方案提供了完整代码与实践指南。

weixin_29056145的博客 266
上一篇: LZW算法原理及实现
下一篇: 单调栈、单调队列和并查集
Cross_Entropy
博客等级 码龄7年 69粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值