DPCM:差分脉冲编码,其关键是预测。

预测的基本原理:利用信源符号之间的相关性,用当前样值以前的若干个样值线性组合作为当前样值的预测值。当仅适用前一样值且预测系数为1时,则为DPCM。若样本序列在时间上有较强的相关性,并且预测阶数和量化比特数选择的足够好,则误差信号的幅度将远远小于原始信号,从而得到较好的压缩。
原理框图:
DPCM压缩实现

m(k)—输入抽样信号  m’ (k)—预测抽样信号
e(k) —输入信号与预测信号的差值,e(k)= m(k)-m’ (k)
eq(k)—量化后的预测信号差值 
 m~(k)—重建信号, m~(k)=eq(k)+m’ (k)

实验中的主要误差来源于量化。且编码器中嵌套了一个解码器。

代码实现:

变量定义:

unsigned char* pBuf = NULL;//存储重建图像值
unsigned char* eBuf_p = NULL;//存储量化后的差值
int eBuf ;//存储差值

开辟内存:

pBuf = (unsigned char*)malloc(frameWidth * frameHeight);
eBuf_p =(unsigned char*)malloc(frameWidth * frameHeight);

一阶(8比特量化):

for( int j=0;j<frameHeight;j++)//j:行
        {//对第一列的像素单独操作
            eBuf=yBuf[j*frameWidth]-128;
            eBuf_p[j*frameWidth]=(eBuf+255)/2;
            yBuf[j*frameWidth]=128+(eBuf_p[j*frameWidth]-127)*2;
            pBuf[frameWidth*j]=128+(eBuf_p[frameWidth*j]-127)*2 ;
            for(i=1+j*frameWidth;i<frameWidth*(j+1);i++)//每次对一行内的像素做预测。以行为周期循环。
            {//i:列,从每一行的第二个像素值开始
                eBuf=yBuf[i]-yBuf[i-1];
                eBuf_p[i]=(eBuf+255)/2;//预测误差的量化值
                yBuf[i] = (eBuf_p[i]-127)*2+yBuf[i-1];//预测值
                pBuf[i] = (eBuf_p[i]-127)*2+pBuf[i-1];//重建值    
            }//
        }
        

由于第一列的像素无参考重建值,故将其参考值固定地设为128。eBuf表示待预测的样本与预测值的差值,取值有正有负,在-255~255之间,预测误差的量化值要限定在0~255范围内,故需要将其映射成正数,再进行量化。本次实验直接将前一样本的重建值作为待预测样本的预测值。

8bit量化:量化级数为256。将映射成的正数除以2即得量化值。4比特量化时,要将中的127 变为255/32(下取整),此时一共有16个量化级。

一阶,预测系数为0.95:

for( int j=0;j<frameHeight;j++)//j:行
        {//对第一列的像素单独操作
            eBuf=yBuf[j*frameWidth]-128;
            eBuf_p[j*frameWidth]=(eBuf+255)/2;
            yBuf[j*frameWidth]=128+(eBuf_p[j*frameWidth]-255/2)*2;
            pBuf[frameWidth*j] = (eBuf_p[frameWidth*j] - 255 /2)*2 + 128;
            for(i=1+j*frameWidth;i<frameWidth*(j+1);i++)
            {//i:列 从每行的第二个元素开始
                eBuf=yBuf[i]-0.95*yBuf[i-1];
                eBuf_p[i]=(eBuf+255)/2;//预测误差的量化值
                yBuf[i] = (eBuf_p[i] - 127)*2 + 0.95*yBuf[i-1];
                pBuf[i] = (eBuf_p[i] - 127)*2 + 0.95*pBuf[i-1];     
            }//
        }

二阶:

DPCM压缩实现

	for( int j=1;j<frameHeight;j++)//j:行
        {
            eBuf=yBuf[j*frameWidth]-128;
            eBuf_p[j*frameWidth]=(eBuf+255)/2;
            yBuf[j*frameWidth]=128+(eBuf_p[j*frameWidth]-127)*2;
            pBuf[frameWidth*j] = (eBuf_p[frameWidth*j] - 127)*2 + 128;
            for(i=1;i<frameWidth;i++)
            {//i:列
                eBuf=yBuf[i+j*frameWidth]-0.5*yBuf[i+j*frameWidth-1]-0.25*yBuf[i+(j-1)*frameWidth]-0.25*yBuf[i+1+(j-1)*frameWidth];
                eBuf_p[i+j*frameWidth]=(eBuf+255)/2;//预测误差的量化值
                yBuf[i+j*frameWidth] = (eBuf_p[i+j*frameWidth] - 127)*2 + 0.5*yBuf[i+j*frameWidth-1]+0.25*yBuf[i+(j-1)*frameWidth]+0.25*yBuf[i+1+(j-1)*frameWidth];
                pBuf[i+j*frameWidth] = (eBuf_p[i+j*frameWidth] - 127)*2 + 0.5*pBuf[i+j*frameWidth-1]+0.25*pBuf[i+(j-1)*frameWidth]+0.25*pBuf[i+1+(j-1)*frameWidth];     
            }//
        }

系数不同:

DPCM压缩实现
DPCM压缩实现
DPCM压缩实现
DPCM压缩实现DPCM压缩实现
DPCM压缩实现
(从上到下,依次为:8比特预测系数1,8比特预测系数0.95,8比特量化二阶)

量化比特数不同:

DPCM压缩实现
DPCM压缩实现
DPCM压缩实现
DPCM压缩实现
DPCM压缩实现
DPCM压缩实现
(量化比特数依次为:8,4,1)

位深度为8的测试文件:


DPCM压缩实现DPCM压缩实现DPCM压缩实现 DPCM压缩实现DPCM压缩实现DPCM压缩实现
(量化比特数为8,预测系数依次为:1,0.95,二阶(0.5,0.25,0.25))

阶数对比:

DPCM压缩实现
DPCM压缩实现DPCM压缩实现
DPCM压缩实现
DPCM压缩实现DPCM压缩实现
量化比特数依次为:8比特,4比特,1比特

重建后的图像:

对原图像和预测误差图像进行huffman编码,结果对比:

DPCM压缩实现

直方图分布:

Bird文件:

DPCM压缩实现 DPCM压缩实现
DPCM压缩实现 DPCM压缩实现
DPCM压缩实现 DPCM压缩实现
实验结论:

预测阶数为2阶时,对预测误差图像编码所需码长较短,但重建图像与原图像在部分区域出现较大误差。

量化比特数越小,对预测误差文件编码需要的码长较短,但重建图像与原图像的误差变大。图像位深度较小时,无法准确重建图像。





相关文章:

  • 2022-02-07
  • 2021-12-21
  • 2022-01-13
  • 2022-01-12
  • 2022-01-20
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-04-24
  • 2022-01-19
  • 2021-04-29
  • 2021-11-21
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案