基于DCT的图像压缩编码算法的MATLAB实现(5)

2019-08-26 18:39

从上面的例子可以看出,压缩比和图像质量是呈反比的,以下是压缩效率与图像质量之间的大致关系,可以根据需要,选择合适的压缩比。压缩比和图像质量的关系如表2-6所示。

表2-6 压缩比与图像质量的关系

压缩效率(单位:bits/pixel) 0.25~0.50 0.50~0.75 0.75~1.5 1.5~2.0 图像质量 中~好,可满足某些应用 好~很好,满足多数应用 极好,满足大多数应用 与原始图像几乎一样 2.2.8 DCT变换在图像压缩中的应用

JPEG格式是目前网络上最流行的图像格式,是可以把文件压缩到最小的格式,在 Photoshop软件中以JPEG格式储存时,提供11级压缩级别,以0—10级表示。其中0级压缩比最高,图像品质最差。即使采用细节几乎无损的10 级质量保存时,压缩比也可达 5:1。以BMP格式保存时得到4.28MB图像文件,在采用JPG格式保存时,其文件仅为178KB,压缩比达到24:1。经过多次比较,采用第8级压缩为存储空间与图像质量兼得的最佳比例。

JPEG格式的应用非常广泛,特别是在网络和光盘读物上,都能找到它的身影。目前各类浏览器均支持JPEG这种图像格式,因为JPEG格式的文件尺寸较小,下载速度快[13]。

19

燕山大学本科生毕业设计(论文)

2.3 JPEG图像压缩MATLAB仿真实现具体代码

% JPEGdemo.m

%组员:池国锟 朱岩 黄晓 秦世宁

%本次我们采用的是JPEG标准中的顺序编码,也叫JPEG算法。 %其中只考虑灰度图片 %{

部分代码我们参考了:

《数字图像处理及matlab实现(第二版)》--杨杰 《matlab数字图像处理实战》---赵小川

《数字图像处理与分析基础--matlab实现》--孔明 博客hesays--《jpeg图像编码解码》

百度文库--《基于matlab的图像编解码技术》 %}

%其实现主要有一下4个步骤: %1) 分块

%2) 离散余弦变换(DCT变换) %3) 量化

%4) 哈弗曼编码

% a) 直流分量的编码过程---》(差分编码:对当前快的直流分量与上一块的直流分量之差进行编码);

% b) 交流分量的编码过程---》除了和直流分量编码一样的话,还采用将连续为零的系数长度及其组合号结合后再进行哈弗曼编码的方法。; clear all clc

% Load data disp('Enter ...')

disp('0 - 加载256 x 256的图片, ') disp('1 - 使用文本输入8*8的矩阵') chos=input('输入你的选择 0/1: ');

if isempty(chos), chos=0;return, end % 默认选择,若为空就默认为0,load 64 x 64; if chos==0,

load lena.mat;

%加载妮娜的图像

%在数字图像处理中,Lena(Lenna)是一张被广泛使用的标准图片, %特别在图像压缩的算法研究中 f=x;

imshow(mat2gray(f)) whos; clear x else

% f为文本输入的8*8矩阵。 f=[139 144 149 153 155 155 155 155 144 151 153 156 159 156 156 156

20

燕山大学本科生毕业设计(论文)

150 155 160 163 158 156 156 156 159 161 162 160 160 159 159 159 159 160 161 162 162 155 155 155 161 161 161 161 160 157 157 157 162 162 161 163 162 157 157 157 162 162 161 161 163 158 158 158]; end

ìho on

%图像的预处理是将每个像素灰度值减去128,

%图像数据值必须减去128,是因为DCT转换公式所接受的数字范围是在-128到+127之间。

if chos==0, f=f-128; elseif chos==1, f=f-128, end %break; drawnow

[mf,nf]=size(f); %返回矩阵的行列

mb=mf/8; nb=nf/8; %%计算f分块后的块数

%计算每个8×8子块的离散DCT系数 if chos==0,

%blkproc()函数的功能:对图像进行分块的dct处理

Ff=blkproc(f,[8 8],'dct');

%对f的每个子块的列进行DCT变换

Ff=blkproc(Ff',[8 8],'dct');

% 对f的每个子块的行进行DCT变换 Ff=round(Ff');

% 对矩阵Ff'中每个元素朝最近的方向取整数部分 elseif chos==1,

Ff=blkproc(f,[8 8],'dct'),

Ff=blkproc(Ff',[8 8],'dct'),

Ff=round(Ff'), end %break;

% 按比例量化 %jpeg亮度量化表

Q =[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

21

燕山大学本科生毕业设计(论文)

49 64 78 87 103 121 120 101 72 92 95 98 112 100 103 99]; %pause

% 现在进行量化取整 if chos==0,

%将频率系数除以量化矩阵的值之后取整,即完成了量化过程 Fq=round(blkproc(Ff,[8 8],'divq',Q)); elseif chos==1,

Fq=round(blkproc(Ff,[8 8],'divq',Q)), end %pause ìho off %{

经过DCT变换后的矩阵数据自然数为频率系数,包括DC,AC; 这些系数以F(0,0)的值最大,称为DC,

其余的63个频率系数则多半是一些接近于0的正负浮点数,一概称之为AC %}

% 对DC系数进行DPCM编码,逐行扫描 %{

DC系数一般采用差分脉冲调制编码DPCM(Difference Pulse CodeModulation), 即:取同一个图像分量中每个DC值与前一个DC值的差值来进行编码。 对差值进行编码所需要的位数会比对原值进行编码所需要的位数少了很多 %}

if mb*nb > 1,

fdc=reshape(Fq(1:8:mf,1:8:nf)',mb*nb,1);

%reshape()函数重新调整矩阵的行数、列数、维数

fdpcm=dpcm(fdc,1);%调用自己定义的dpcm函数进行DPCM编码 elseif chos==1,

fdpcm=Fq(1,1)-(-17); else

fdpcm=Fq(1,1); end

dccof=[];

for i=1:mb*nb,

dccof=[dccof jdcenc(fdpcm(i))]; end

if chos==1,

disp(['微分直流(DC)系数(“num2str(fdpcm)”)编码: ']); disp(int2str(dccof)); end %pause ìho on

% AC编码方式与DC略有不同,在AC编码之前,首先得将63个AC值按Zig-zag排

22

燕山大学本科生毕业设计(论文)

序。

z=[1 2 6 7 15 16 28 29 3 5 8 14 17 27 30 43 4 9 13 18 26 31 42 44 10 12 19 25 32 41 45 54 11 20 24 33 40 46 53 55 21 23 34 39 47 52 56 61 22 35 38 48 51 57 60 62 36 37 49 50 58 59 63 64]; %pause ìho off acseq=[];

%双层循环输出从1到mb,和1到nb,即对所有的8*8中矩阵每个元素进行z编码for i=1:mb for j=1:nb

tmp(z)=Fq(8*(i-1)+1:8*i,8*(j-1)+1:8*j);

%从左上角第一个8*8小块开始到右下角最后一个8*8小块结束。 % tmp is 1 by 64

eobi=max(find(tmp~=0)); %找出不等于0中的最大值 %end of block index

% eob is labelled with 999 acseq=[acseq tmp(2:eobi) 999]; end end

accof=jacenc(acseq); whos;

disp(['Huffman编码后直流(DC)系数为 ' int2str(length(dccof)) ... ' bits']);

disp(['Huffman编码后交流(AC)系数为 ' int2str(length(accof)) ... ' bits']);

disp(['mb:' num2str(mb)]) disp(['nb:' num2str(nb)])

disp(['压缩率(length(dccof)+length(accof))/(mb*nb*8*8)为: num2str((length(dccof)+length(accof))/(mb*nb*64)) ' Bits / pixel ']) %bpp(图像像素值的位数即图像的像素深度)来衡量压缩比

disp(['压缩比 8/((length(dccof)+length(accof))/(mb*nb*8*8))为: num2str(8/((length(dccof)+length(accof))/(mb*nb*64))) ' : 1'])

运行结果如下:

23

'

'

燕山大学本科生毕业设计(论文)

24


基于DCT的图像压缩编码算法的MATLAB实现(5).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:5现场检测道路交通安全设施

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: