matlab数据块的dct编码,[转载]基于DCT图像压缩编码算法的MATLAB实现

图像压缩的过程可以概括成图所示的三个步骤,原始图像经映射变换后的数据再经量化器和熵编码器成为码流输出。

(1)映射变换。其目的是通过映射改变图像数据的特性,使之更有利于压缩编码。

(2)量化器。在限失真编码中要对映射后的数据进行量化,若量化是对映射后的数据逐个的进行的,则称标准量化,若量化是成组的进行的,则称矢量量化,量化总会造成某些信息丢失,形成失真,即量化失真或量化噪声,为使失真小,应量化的精细,但压缩比就高不了,这是一对矛盾,应选用恰当的量化级数和量化曲线形状来缓解这对矛盾,量化器的引入是图像编码产生失真的根源,在要求复原图像与原图完全一致的无失真编码器中必须不用量化器,但这样一来,压缩比难以提高,在多数应用中,存在少量失真并不可怕,只要把失真的程

度和性质控制在允许的范围内,也就是把复原图像的主观质量控制在允许的程度内,就可以

在满足应用要求的前提下提高压缩比,值得注意的是,对于同样的量化失真,不同的映射变

换和反变换反映不同性质的复原图像的失真,人眼对某些性质的失真敏感而对另一些性质

的失真不敏感。

(3)熵编码器。这一步是用来消除符号编码冗余度的,它一般不产生失真,理想的情况

是编出的码流的平均码长等于量化后数据的信息熵,常用的编码方法有许多种,例如分组

码、行程码(RLC)和变长码(VLC)、不分组码以及算术码(Arithmatic Coing等)。行程码传输

的是数据行程长度而不是数据本身,例如要传108个0,用行程码是改为传行程码标记和行程长度1080在变长码中最常用的是霍夫曼(Hufman)码,基本原则是对出现概率大的数值用短码来编,对出现概率小的数值用长码来编,从而使平均码长减小。降低码率,在实际编码器中常把RLc和Hufman码结合起来,称为霍夫曼行程码,在H.261,JPEG,啪PEG等国际昧准中用到它,而算术码则用于JPEG,H.263,JBIG等国际标准中。

3) MATLAB仿真实现

根据压缩编码算法,要将一幅灰度图像进行压缩编码,首先把图像分成8×8的像素块,分块

进行DCT变换后,根据标准量化表Es]对变换系数进行量化后,再对直流系数(DC)进行预测编码,然后根据标准的Huffman码表蜘进行熵编码,输出压缩图像的比特序列,实现了图像压缩。在接收端,则经过Huffman熵解码、DC系数和AC系数可变长解码、反量化后,再进行反DCT变换得到重建图像。对一幅图像进行编解码的MATLAB程序流程图:

2、离散余弦变换(DCT)

2.1DCT的定义

DCT变换利用傅立叶变换的性质.采用图像边界褶翻将像变换为偶函数形式,然后对图像进行二维傅立叶变换,变后仅包含余弦项.所以称之为离散余弦变换。二维离散余弦变换DCT(DiscreteCosineTransform)的定为.假设矩阵A的大小为MxN。

其中。Bpq称为矩阵A的DCT系数。在MATLAB中,矩阵的下标从l开始而不是从0开始的,所以MATLAB中的矩阵元素A(1,1)和B(1,1)分别对应于上面定义中的值A加和B。。,

依此类推。DCT是一种可逆变换,离散反余弦变换定义如下:

上式的含义是任何MxN的矩阵A都nJ以表示为一系列有下面形式的函数的和:

这些函数称为DCT变换的基函数。这样.Bpq就可以看成是应用于每个基函数的加权。

2.2DCT和图像压缩

DCT编码属于正交变换编码方式.用于去除图像数据的空间冗余。变换编码就是将图像光强矩阵(时域信号)变换到系数空间(频域信号)上进行处理的方法。在空问上具有强相

关的信号,反映在频域上是在某些特定的区域内能量常常被集中在一起,或者是系数矩阵的分布具有某些规律。我们可以利用这些规律在频域上减少量化比特数,达到压缩的目的。图像经DCT变换以后,DCT系数之间的相关性已经很小。而且大部分能量集中在少数的系数上,因此,DCT变换在图像压缩中非常有用,是有损图像压缩国际标准JPEG的核心。从原理上讲可以对整幅图像进行DCT变换,但由于图像各部位上细节的丰富程度不同,这种整体处理的方式效果不好。为此,发送者首先将输入图像分解为8x8或16x16的块,然后再对每个图像块进行二维DCT变换,接着再对DCT系数进行量化、编码和传输;接收者通过对量化的DCT系数进行解码,并对每个图像块进行的二维DCT反变换.最后将操作完成后所有的块拼接起来构成一幅单一的图像。对于一般的图像而言,大多数DCT系数值都接近于0,町以去掉这些系数而不会对重建图像的质量产生霞大影响。此,利用DCT进行圈像压缩确实可以节约大量的存储空间在宴验中,先将输入的原始lena图像分为8x8的块,然

后再对每个块进行二维DCT变换。MATLAB图像处理上具箱中提供的二维DCT变换及DCT反变换函数如下。

2.2.1.dcL2

dct2实现罔像的二维离散余弦变换.其语法格式为:

(1)B=dct2(A)

返回图像A的二维离散余弦变换值,其大小与A相同且各元素为离散余弦变换的系数B(K1,k2)。

(2)B=dct2(A,in,n)或B=dct2(A,[m,n])

如果m和n比图像A大,在对图像进行二维离散余弦变换之前,先将图像A补零至mxn如果m和n比图像A小。则进行变换之前,将图像A剪切。

2.2.2 idct2

idct2可以实现图像的二维离散余弦反变换,其语法格式为:

B=idct2(A);B=idct2(A,m,n)或B=idct2(A,[m,n])。

3图像编码

3.1图像编码的分类

图像编码压缩的方法目前有很多,其分类方法根据出发点不同而有差异。

根据解压重建后的图像和原始图像之间是否具有误差(对原图像的保真程度),图像编码压缩分为无误差(亦称无失真、无损、信息保持)编码和有误差(有失真或有损)编码两大类。

无损压缩(冗余度压缩、可逆压缩):是一种在解码时可以精确地恢复原图像,没有任何损失的编码方法,但是压缩比不大,通常只能获得1~5倍的压缩比。用于要求重建后图像严格地和原始图像保持相同的场合,例如

复制、 保存十分珍贵的历史、文物图像等;

有损压缩(不可逆压缩):只能对原始图像进行近似的重建,而不能精确复原,适合大数工用于存储数字化了的模拟数据。

压缩比大,但有信息损失。

3.2

无损编码

3.2.1行程编码(RLE)

在一个逐行存储的图像中,具有相同灰度值的一些象素组成的序列称为一个行程。在编码时,对于每个行程只存储一个灰度值的码,再紧跟着存储这个行程的长度。这种按照行程进行的编码被称为行程编码(Run

Length Encoding)。

行程编码对于仅包含很少几个灰度级的图像,特别是二值图像,比较有效。

3.2.2Huffman编码

Huffman编码是50年代提出的一种基于统计的无损编码方法,它利用变长的码来使冗余量达到最小。通过一个二叉树来编码,使常出现的字符用较短的码代表,不常出现的字符用较长的码代表。静态Huffman编码使用一棵依据字符出现的概率事先生成好的编码树进行编码。而动态Huffman编码需要在编码的过程中建立编码树。

由于Huffman编码所得到的平均码字长度可以接近信源的熵,因此在变长编码中是最佳的编码方法,故也称为熵编码。

具体编码方法是:①把输入元素按其出现概率的大小顺序排列起来,然后把两个具有最小概率的元素之概率加起来;②把该概率之和同其余概率大小顺序排队,然后再把两个最小概率加起来,再重新排队;③重复②,直到最后得到和为1的根节点。

3.3有损编码

3.3.1量化

将图像用较少的灰度级别来表示是最简单的减小数据量的方法,这种方法就是标量量化方法。更一般的情况是,针对连续量的采样过程,量化是用有限个状态来表示连续值。

3.3.2预测编码

预测编码根据数据在时间和空间上的相关性,根据统计模型利用已有样本对新样本进行预测,将样本的实际值与其预测值相减得到误差值,再对误差值进行编码。由于通常误差值比样本值小得多,因而可以达到数据压缩的效果。

模拟量到数字量的转换过程是脉冲编码调制过程PCM

,也称PCM编码。对于图像而言,直接以PCM编码,存储量很大。预测编码可以利用相邻象素之间的相关性,用前面已出现的象素值估计当前象素值,对实际值与估计值的差值进行编码。常用的一种线性预测编码方法是差分脉冲编码调制DPCM。

预测编码通常不直接对信号编码,而是对预测误差编码。当预测比较准确,误差较小时,即可达到编码压缩的目的。这种编码称之为差分脉冲编码调制(DPCM),上图是原理框图。在该系统中,xN为tN时刻的亮度取样值。预测器根据tN时刻之前的样本x1,x2,…,xN-1对xN作预测,得到预测值x'N。xN与x'N之间的误差为

量化器对eN进行量化得到e‘N。编码器对e’N

进行编码发送。接收端解码时的预测过程与发送端相同,所用预测器亦相同。接收端恢复的输出信号 是xN的近似值,两者的误差是

当ΔxN足够小时,输入信号xN 和DPCM系统的输出信号几乎一致。

3.3.3DCT编码

DCT变换是图像压缩标准中常用的变换方法,如JPEG标准中将图像按8x8分块利用DCT变换编码实现压缩

3.4保真度准则

在图像压缩编码中,解码图像与原始图像可能会差异,因此,需要评价压缩后图像的质量。描述解码图像相对原始图像偏离程度的测度一般称为保真度(逼真度)准则。常用的准则可分为两大类:客观保真度准则和主观保真度准则。

3.4.1客观保真度准则

最常用的客观保真度准则是原图像和解码图像之间的均方根误差和均方根信噪比两种。令f(x,y)代表原图像,

代表对f(x,y)先压缩又解压缩后得到的f(x,y)的近似,对任意x和y,f(x,y)和

之间的误差定义为:

若f(x,y)和 均为M×N,则它们之间均方根误差 为:

如果将

看作原始图f(x,y)和噪声信号e(x,y)的和,那么解压图像的均方信噪比

为:

如果对上式求平方根,就得到均方根信噪比

3.4.2主观保真度准则

尽管客观保真度准则提供了一种简单、方便的评估信息损失的方法,但很多解压图最终是供人观看的。事实上,具有相同客观保真度的不同图像,在人的视觉中可能产生不同的在视觉效果。这是因为客观保真度是一种统计平均意义下的度量准则,对于图像中的细节无法反映出来。而人的视觉系统具有独特的特性,能够觉察出来。这种情况下,用主观的方法来测量图像的质量更为合适。1种常用的方法是对1组(不少于20人)观察者显示图像,并将他们对该图像的评分取平均,用来评价一幅图像的主观质量。

4 MATLAB仿真及效果

4.1程序

%程序功能:模拟DCT编码解码过程,生成带“块效应”的图像

%步骤:灰度图像→DCT→量化→反量化→IDCT

%下一步目标:实现对任意大小图象的处理。(判断图象大小,若不是2的整数次方,则补零)

I=imread('cameraman.tif')

I=im2double(I) %转换图像矩阵为双精度型。

T=dctmtx(8)%产生二维DCT变换矩阵

%计算二维DCT,矩阵T及其转置是DCT函数P1*X*P2的参数

a1=[16 11 10 16 24 40 51 61;

12 12 14

19 26 58 60 55;

14 13 16

24 40 57 69 56;

14 17 22

29 51 87 80 62;

18 22 37

56 68 109 103 77;

24 35 55

64 81 104 113 92;

49 64 78

87 103 121 120 101;

72 92 95

98 112 100 103 99 ];

for i=1:8:200

for

j=1:8:200

P=I(i:i+7,j:j+7);

K=T*P*T';

I2(i:i+7,j:j+7)=K;

K=K./a1;%量化

K(abs(K)<0.03)=0;

I3(i:i+7,j:j+7)=K;

end

end

figure;

imshow(I2);

title('DCT变换后的频域图像');%显示DCT变换后的频域图像

for i=1:8:200

for

j=1:8:200

P=I3(i:i+7,j:j+7).*a1;%反量化

K=T'*P*T;

I4(i:i+7,j:j+7)=K;

end

end

figure;

imshow(I4);

title('复原图像');

imwrite(I4,'复原图像6.jpg');

B=blkproc(I,[8,8],'P1*x*P2',T,T')

%二值掩模,用来压缩DCT系数,只留下DCT系数中左上角的10个

mask=[1 1 1 1 0 0 0 0

1 1 1 0 0 0 0 0

1 1 0 0 0 0 0 0

1 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 ]

B2=blkproc(B,[8

8],'P1.*x',mask) %只保留DCT变换的10个系数

I2=blkproc(B2,[8

8],'P1*x*P2',T',T) %重构图像

figure

imshow(I)

title('原始图像');

figure

imshow(I2);

title('压缩图像');

figure

imshow(dct2(I));

figure

mesh(dct2(I))

colorbar('horiz')

你可能感兴趣的:(matlab数据块的dct编码)