应用Matlab小波变换工具箱进行图像压缩

应用Matlab小波变换工具箱进行图像压缩

  • 图像压缩的原理
    • 使用函数dwt2进行小波分解
    • 利用小波工具箱中专用的阈值压缩图像函数wdencmp进行压缩

图像压缩的原理

从数学的角度看,信号与图像处理可以统一看作信号处理(图像可以看作二维信号)。
图像压缩是将原来较大的图像尽可能的以较少的字节表示和传输,并要求图像有较好的质量。图像数据之所以可以压缩,数学原理主要有两点:
(1)原始图像数据存在信息冗余(如空间冗余、视觉冗余和结构冗余等),数据之间存在相关性,领域像素的灰度往往是高度相关的。
(2)人眼对亮度信息敏感,而对颜色分辨率比较弱,所以在高压缩比的情况下,压缩后的图像仍可以满足主观质量。
小波变换通过多分辨率分析将一幅图像分成近似和细节两部分,细节对应的是小尺度的瞬变,在本尺度内很稳定。因此将细节存储起来,对近似部分在下一个尺度下进行分解,重复该过程即可。
小波图像压缩的特点在于压缩比高、压缩速度快,压缩后能保持信号与图像的特征基本不变,且在传递过程中可以抗干扰。

使用函数dwt2进行小波分解

对图像做小波分解后,可得到一系列不同分辨率的子图像(他们所对应的频率不同)。对于图像来说,表征他的最主要部分是低频部分(即图像的近似),而高频部分(对应于图像的细节)大部分点的数值接近0,频率越高,这种现象越明显。因此,利用小波分解去掉图像的高频部分而仅保留图像的低频部分是一种最简单的图像压缩方法。
首先使用dwt2对图像进行小波分解后,再用upcoef2函数对分解后的图像进行重构,最后用wcodemat函数进行量化编码。
下面展示一些 内联代码片

%拓展二维图像的伪彩色矩阵比例
clear all;
load woman;
subplot(2,4,1);image(X);
colormap(map);  %查看并设置当前颜色图,用map矩阵映射当前图形的色图
title ('原始图像')
%colormap的范围
NBCOL = size(map,1);
% 利用db1对图像进行单尺度二维离散分解,使用函数dwt2进行小波分解
%分解为:近似系数cA1、水平细节分量cH1、垂直细节分量cV1、对角细节分量cD1
[cA1,cH1,cV1,cD1] = dwt2(X,'db1');
subplot(2,4,2);image(cA1);
colormap(map);
title ('近似分量系数');

subplot(2,4,3);image(cH1);
colormap(map);
title ('水平细节分量');

subplot(2,4,4);image(cV1);
colormap(map);
title ('垂直细节分量');

subplot(2,4,5);image(cD1);
colormap(map);
title ('对角细节分量');

subplot(2,4,6);imshow([cA1,cH1;cV1,cD1]);
title('小波分解四个分量合成图像');

% 从二维小波系数直接重建
% Y = upcoef2(OX,wname,NS)计算矩阵XN步重构系数,并取大小为S的中心部分。wname是指定小波的字符向量或字符串标量。 
% 如果O ='a',则重建近似系数; 否则,如果O ='h'(分别为'v''d'),则重构水平(分别为垂直或对角线)细节系数。 N必须是严格的正整数。
r_cA=upcoef2('a',cA1,'db1');%低频重构,重构近似部分
subplot(2,4,7);
image(r_cA);
title('重构近似部分');

% 对近似图像进行量化编码
% 使用wcodemat扩展伪彩色矩阵标度,对数据矩阵进行伪彩色编码,wcodemat将输入矩阵重新缩放到指定范围以便显示。
% Y=wcodemat(X,NBCODES,OPT,ABSOL):
%       如果ABSOL=0,则返回输入矩阵X的编码;如果ABSOL不为0,则返回ABSX)。默认为1%       参量NBCODES为最大编码值。默认为16%       如果OPT=row或r,以行形式编码;如果OPT=col或c,以列形式编码;如果OPT=mat或m,以矩阵形式编码。默认为mat。
cD=wcodemat(r_cA,NBCOL);
subplot(2,4,8);image(cD);
colormap(map);
title('缩放图像');

应用Matlab小波变换工具箱进行图像压缩_第1张图片

利用小波工具箱中专用的阈值压缩图像函数wdencmp进行压缩

[XC,CXC,LXC,PERF0,PERFL2] = wdencmp(‘gbl’,X,‘wname’,N,THR,SORH,KEEPAPP);
函数wdencmp用于一维或二维信号的去噪或压缩。
gbl:表示每一层都采用一个阈值进行处理;lvd:表示每一层用不同的阈值进行处理。
X:输入的图像。
wname:表示使用的小波函数名称。
N:表示小波分解的层数。
THR:表示阈值向量,若为lvd则每一层都需要一个阈值,因此THR的尺度为N。
SORH:表示选择软阈值(s)还是硬阈值(h)。
KEEPAPP:为1时,低频系数不进行阈值处理,反之,低频系数进行阈值处理。

XC:去噪或压缩后的信号。
[CXC.LXC]:是XC的小波分解结构。
PERF0:压缩后图像剩余能量百分比。
PERFL2:小波系数中置0的系数个数百分比。

clear all;  %清空工作空间变量
load detfingr; %导入图像数据
nbc=size(map,1);
% 二维小波分解
% [CS] = wavedec2(XN,wname)使用小波wname返回级别为N的矩阵X的小波分解。 输出分解结构由小波分解向量C和bookkeeping矩阵S组成,bookkeeping矩阵S包含按级别和方向排列的系数数。
[C,S]=wavedec2(X,2,'db4');%图像小波2级分解

%提取1级小波分解的近似和细节图
[H1,V1,D1] = detcoef2('all',C,S,1);
A1 = appcoef2(C,S,'db4',1);

%使用wcodemat去根据系数重新缩放图像
V1img = wcodemat(V1,255,'mat',1);
H1img = wcodemat(H1,255,'mat',1);
D1img = wcodemat(D1,255,'mat',1);
A1img = wcodemat(A1,255,'mat',1);

figure
colormap(map)
subplot(2,2,1)
% 将数组 C 中的数据显示为一个图像,该图像使用颜色图中的全部颜色。
imagesc(A1img)
title('Approximation Coef. of Level 1')

subplot(2,2,2)
imagesc(H1img)
title('Horizontal Detail Coef. of Level 1')

subplot(2,2,3)
imagesc(V1img)
title('Vertical Detail Coef. of Level 1')

subplot(2,2,4)
imagesc(D1img)
title('Diagonal Detail Coef. of Level 1')

thr_h=[21 46];            %设置水平分量阈值
thr_d=[21 46];            %设置对角分量阈值
thr_v=[21 46];            %设置垂直分量阈值   
thr=[thr_h;thr_d;thr_v]; 

% wdencmp去噪或压缩
[Xcompress2,cxd,lxd,perf0,perfl2]=wdencmp('lvd',X,'db3',2,thr,'h');%进行分层压缩
set(0,'defaultFigurePosition',[100,100,1000,500]);%修改图形图像位置的默认,设置figure显示的起点坐标bai是du(100,100) 宽度是1000 高度是500
set(0,'defaultFigureColor',[1 1 1])       %修改图形背景颜色的设置
Y=wcodemat(X,nbc);  %在nbc范围显示原图
Y1=wcodemat(Xcompress2,nbc);    %在nbc范围显示压缩后的图
figure %显示原图像和压缩图像
colormap(map)
subplot(121),image(Y),axis square       %设置坐标轴范围和纵横比 使用相同长度的坐标轴线。相应调整数据单位之间的增量。
title('映射数组压缩前图像');
subplot(122),image(Y1),axis square
title('映射数组压缩后图像');

disp('小波系数中置0的系数个数百分比:')  %显示压缩能量
perfl2
disp('压缩后图像剩余能量百分比:')
perf0

应用Matlab小波变换工具箱进行图像压缩_第2张图片
应用Matlab小波变换工具箱进行图像压缩_第3张图片

你可能感兴趣的:(图像处理matlab,matlab,计算机视觉)