DPCM

部署运行你感兴趣的模型镜像

DPCM压缩系统的实现与分析

1.DPCM 编解码原理

预测编码是根据某一模型利用以往的样本值对于新样本值进行预测,然后将样本的实际值与其预测值相减得到一个误差值,对于这一误差值进行编码。如果模型足够好且样本序列在时间上相关性较强,那么误差信号的幅度将远远小于原始信号,从而得到较大的数据压缩结果。
预测编码方法分线性预测和非线性预测编码方法。线性预测编码方法,也称差值脉冲编码调制法,简称DPCM。
encoder图中输入信号Xn是某一像素点的实际灰度值,Pn是对该像素点的预测值,在本实验中就是与它相邻的前一个像素点的重建值。dn 是预测误差。^(dn)是量化预测误差,^(Xn)=量化预测误差^(dn)+预测灰度值Pn,得到当前像素点的重建值,作为下一个像素点的预测值。
预测器的输入是已经解码以后的样本,因为在解码端只能得到存在误差的样本。
由图可见,encoder中包含了一个decoder。


2.代码分析

//<-------------------dpcm函数8比特量化------------------------->
bool dpcm(int Width,int Height, unsigned char* yBuf,unsigned char* devBuf,unsigned char* rebuild_Buf)//DPCM
 {
        int err;//原始误差
	   int i,j;
	   unsigned char temp;
	   for(i=0;i<Height;i++)
	   {
	        //假设第一个像素的预测值为128
	      err = yBuf[i*Width]-128;//(-128,128)
		 devBuf[i*Width] = err/2 + 64 ;//先将原始误差进行8bit量化再把电平提升到(0,128)
		 temp =(devBuf[i*Width]-64)*2+128;//量化误差降低电平后再进行反量化,最后加上预测值
		  rebuild_Buf[i*Width]=temp;//重建值
		  for(j=1;j<Width;j++)
		  {
		    err = yBuf[i*Width+j]-rebuild_Buf[i*Width+j-1];//原始误差 = 当前样本-当前样本的预测值;(-255,255)
		    devBuf[i*Width+j] = err/2+127;//进行8bit量化,再提升电平最后范围(0,254)
		     temp =( devBuf[i*Width+j]-127)*2  + rebuild_Buf[i*Width+j-1]; 
		 rebuild_Buf[i*Width+j]=temp;// 重建值
		  }
	   }
	   return true;
 }

 规定每一行第一个像素的预测值均为128,而剩下的像素点均把与它相邻的前一个像素点的重建值作为自己的预测值。
假设存在一个像素点的灰度值为0,预测值为0,则量化误差值等于127,最后得到的重建值为0。
......
假设存在一个像素点的灰度值为128,预测值为0,则量化误差值等于191,最后得到的重建值为128。
......
假设存在一个像素点的灰度值为255,预测值为0,则量化误差值等于254,最后得到的重建值为254。
........
重建值与像素点的原始灰度值基本不差。

8比特量化即256个量化级,原始的量化误差范围是(-255,255),256<511<1024,相当于9比特量化到8比特,除2取整即相当于8比特量化,量化电平取左端点。
除了8比特还可以进行1,2,4比特的量化,以4比特为例,9比特到4比特量化,量化误差整除2 的9-4次方,即整除32。提升电平也要根据区间变化跟着改变。但是发现重建图像出现一些明显的失真。并且经过2bit量化之后,图像已经无法实现重建。以下是该算法4bit量化的重建图。

改进代码4bit量化

bool dpcm(int Width,int Height, unsigned char* yBuf,unsigned char* devBuf,unsigned char* rebuild_Buf)//DPCM
{
int err;//原始误差
int i,j;
unsigned char temp;
for(i=0;i<Height;i++)
{
//假设第一个像素的预测值为128
	      err = yBuf[i*Width]-128;//(-128,128)
		  devBuf[i*Width] = (err+255)/32 ;
		 temp =(devBuf[i*Width]-255/32)*32+128;
		if(temp>255)
			 temp=255;
		 if(temp<0)
			 temp=0;
		  rebuild_Buf[i*Width]=temp;
		  for(j=1;j<Width;j++)
		  {
		    err = yBuf[i*Width+j]-rebuild_Buf[i*Width+j-1];//原始误差 = 当前样本-当前样本的预测值;(-255,255)
			 devBuf[i*Width+j] = (err+255)/32;//将电平提升到(0,510)之后再进行量化,结果区间(0,15)
		   temp =( devBuf[i*Width+j]-255/32)*32  + rebuild_Buf[i*Width+j-1]; //重建值
			if(temp>255)
			 temp=255;
		     if(temp<0)
			 temp=0;
		 rebuild_Buf[i*Width+j]=temp;
}
}
return true;
}


3.实验结果分析


                  原始图像                                              量化误差图像                                重建图像                                                     文件名
                                   Birds
                                     Camman256B
                                     Clown256B
                                      Fruit256B
                                       haer
                                       Lena256B
              lufei
             Noise256B    
              Odie256B
              Zone256B
由以上图像对比,经过8比特量化之后重建的图像与原图像在图像质量上的差别不大。

概率分布图的顺序与图像顺序相同。将预测误差图像和原始文件图像经过Huffman编码器。
        
                       原始图像概率分布图                                                                       量化误差图像概率分布图    











压缩比

一般图像经过量化之后的熵编码效率明显提高,概率分布也更加集中,但是Noise256B和Zone256B的编码效率反而降低了。预测编码利用的是相邻像素点之间的相关性。如果相邻像素点之间的相关性大,预测就会更加准确,误差就会越小,从而在同等精度的要求下,就可以用较少的比特进行编码;但是如果水平方向上,相邻像素点的相关性非常小,预测误差就会大大增加,需要用更多的比特来进行编码。Noise256B和Zone256B这两张图像与其余图像的区别在于水平方向上像素点的灰度变化太大,从而造成压缩比降低。























您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

04-28
### DPCM 编码与解码原理及其实现 #### 一、DPCM 的基本概念 DPCM(差分脉冲编码调制)是一种基于预测编码的典型数据压缩技术。其核心思想是利用相邻样本之间的强相关性来减少冗余信息,从而提高传输效率。在 DPCM 系统中,当前样本值通过一个预测器估计得出,并计算该估计值与真实值之间的误差[^1]。 由于解码端无法获得原始样本,而只能获取经过量化处理后的近似样本,因此在编码过程中需要嵌入一个解码器用于模拟解码过程中的误差传播效应。这种机制确保了编解码的一致性和稳定性[^2]。 --- #### 二、DPCM 的工作流程 在一个完整的 DPCM 系统中,主要涉及以下几个模块: 1. **预测器** 预测器的作用是对下一个采样点进行估算。通常采用线性模型或其他更复杂的统计方法完成这一任务。预测的结果越接近真实的采样值,则后续产生的误差就越小,进而降低所需的比特率[^3]。 2. **量化器** 对于预测误差信号,需对其进行离散化操作以便存储或传输。此步骤会引入一定的失真程度,但可以通过调整量化步长等方式控制质量损失的程度[^1]。 3. **编码/解码部分** 经过量化的误差被进一步转换成适合特定信道特性的形式发送出去;接收方则依据相同的规则反向重建出原始序列的一部分特征[^2]。 --- #### 三、Python 实现示例 以下是使用 Python 实现的一个简单版本的 DPCM 编码与解码逻辑: ```python def dpcm_encode(input_signal, predictor_func=lambda prev: prev): """ 使用简单的前值作为预测因子实现 DPCM 编码。 参数: input_signal (list): 输入信号列表。 predictor_func (function): 预测函数,默认为上一个值。 返回: list: 差分信号。 """ diff_signal = [] previous_sample = 0 for sample in input_signal: predicted_value = predictor_func(previous_sample) error = sample - predicted_value # 计算误差 diff_signal.append(error) # 存储误差 previous_sample = sample # 更新前值 return diff_signal def dpcm_decode(diff_signal, predictor_func=lambda prev: prev): """ 根据给定的差分信号恢复原始信号。 参数: diff_signal (list): 差分信号列表。 predictor_func (function): 预测函数,默认为上一个值。 返回: list: 恢复后的信号。 """ reconstructed_signal = [] previous_sample = 0 for error in diff_signal: predicted_value = predictor_func(previous_sample) current_sample = predicted_value + error # 还原当前值 reconstructed_signal.append(current_sample) previous_sample = current_sample # 更新前值 return reconstructed_signal # 测试代码 if __name__ == "__main__": original_signal = [10, 15, 18, 20, 22, 24] encoded_signal = dpcm_encode(original_signal) decoded_signal = dpcm_decode(encoded_signal) print(f"Original Signal: {original_signal}") print(f"Encoded Signal : {encoded_signal}") print(f"Decoded Signal : {decoded_signal}") ``` 上述程序展示了如何定义基础的预测函数以及执行相应的编码和解码动作[^2]。 --- #### 四、MATLAB 实现概述 如果倾向于 MATLAB 平台开发类似的解决方案,可以参考如下框架结构: - 主脚本负责加载待处理图像文件并将其转换为目标格式; - 调用 `my_dpcmEncoder` 函数生成量化后的残差数组; - 利用 `my_dpcmDecoder` 将这些数值还原回接近初始状态的画面表示[^3]。 具体细节可能因项目需求不同有所变化,请根据实际情况灵活修改参数设置或者扩展功能选项。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值