小波变换在图像压缩方面的分析与应用(Matlab代码)

小波变换在图像压缩方面的实现与应用

  • 一、实验图片的基本信息
  • 二、数据处理过程
    • 2.1小波函数的选择
    • 2.2图像压缩的基本思想
  • 三、不同小波函数压缩程度的对比
  • 四、MATLAB源码

一、实验图片的基本信息

小波变换作为一种新的数学工具,不仅继承了傅立叶变换的优点,同时又克服了它的许多缺点。由于小波变换是将图像分解成不同的频率子带。恰巧人眼对不同的频带的信息具有不同的响应,这一点人的视觉系统与小波很相似。数字图像压缩编码标准JPEG2000采用的就是小波变换技术。
为了验证小波变换技术在图像压缩方面的性能,现取一张手机拍摄的图片,用MATLAB将其转化为灰度图,如下所示(原始彩图和转变完的灰度图)。图片大小为41.1KB,像素为 375 × 500 375 \times 500 375×500。(原图和源代码在我的上传资源“小波变换wavelet代码.rar”中)
小波变换在图像压缩方面的分析与应用(Matlab代码)_第1张图片

小波变换在图像压缩方面的分析与应用(Matlab代码)_第2张图片

二、数据处理过程

2.1小波函数的选择

小波变换不同于傅里叶变换,根据小波母函数的不同,小波变换的结果也不尽相同。

从小波变换的原理出发,可以总结出一些选择标准:如支撑大小,对称性,正则性(平滑性)等。

支撑性:
大部分应用选择支撑长度为5~9之间的小波,因为支撑长度太长会产生边界问题,支撑长度太短精度太低,不利于信号能量的集中。

对称性:
具有对称性的小波,在图像处理中可以很有效地避免相位畸变。

正则性(平滑性):
在量化或者舍入小波系数时,为了减小重构误差对人眼的影响,必须尽量增大小波的光滑性或者连续可微性。也就是说正则性好的小波,能在信号或图像的重构中获得较好的平滑效果,减小量化或舍入误差的视觉影响。

本实验选用最基础的Haar小波函数、sym和JPEG2000标准中的Daubechies小波函数进行对比分析。它们都具有正交性,紧支撑性,对称性的小波函数。Haar小波函数的支撑长度为1,滤波器长度为2,消失矩阶数为1。Daubechies小波函数的支撑长度为2N-1,滤波器长度为2N,消失矩阶数为N-1。

2.2图像压缩的基本思想

小波变换用于图像压缩的基本思想就是根据二维小波分解算法,将一幅图像做小波分解,可得到一系列不同分辨率的图像。表现一幅图像最主要的部分是低频部分,而水平、垂直和对角线部分表征了原图像的边缘信息,具有明显的方向特性。低频部分可以称为亮度图像,水平、垂直和对角线部分可以称为细节图像。如果去掉图像的高频部分,保留低频部分,再根据人类的视觉生理和心理特点分别作不同策略的量化和编码处理,则可以达到图像压缩的目的。
在MATLAB中,**用wavedec2函数,对小波进行分解;用appcoef2函数,获得图像的近似信息(低频部分);用detcoef2函数,获得图像在水平、垂直和对角方向的细节信息(高频部分)。**各方向信息如下图所示。
小波变换在图像压缩方面的分析与应用(Matlab代码)_第3张图片

利用wcodemat函数,对尺度1下的低频系数第一次压缩并对第一层信息进行量化编码。对尺度2下的低频系数做同样的操作,对图像进行第二次压缩。压缩后的图像如下图所示。
小波变换在图像压缩方面的分析与应用(Matlab代码)_第4张图片

三、不同小波函数压缩程度的对比

Haar和Daubechies小波函数压缩图像结果如下表所示。用sym5小波基得到压缩图像效果和Daubechies一样,就不再列出。

表1 两种不同的小波函数压缩图像结果

小波变换在图像压缩方面的分析与应用(Matlab代码)_第5张图片
从以上数据可以看出,两个方法的第一次压缩是提取原始图像中小波分解第一层的低频信息,此时压缩效果较好,压缩比较小约为1/4。第二次压缩是提取第一层分解低频部分的低频部分,即小波分解第二层的低频部分,其压缩比比较大,约为1/14。压缩效果在视觉上也基本过得去,它不需要经过其他处理即可获得较好的压缩效果。由表格可以看出,Haar小波变换的压缩性能稍微好于Daubechies(N=5)。当Daubechies小波函数中的N=1时为Haar小波。Haar小波在时域上是不连续的,所以作为基本小波性能不是特别好。Daubechies小波的特点是随着阶次(序列N)的增大消失矩阶数越大,其中消失矩越高光滑性就越好,频域的局部化能力就越强,频带的划分效果越好,所以在实际生活中的很多情景下Daubechies小波函数适用性更强。

四、MATLAB源码

% 数据压缩 ——图像压缩
% 2020.12.31 hx
close all;  clc; clear;   
data =imread('merry.jpg');    
data=rgb2gray(data); whos('data');
figure; imshow(data);
title('原始图像');

% 小波分解
[c,s]=wavedec2(data,2,'sym3');
cA1=appcoef2(c,s,'sym3',1);%尺度1的低频系数
cA2=appcoef2(c,s,'sym3',2);%尺度2的低频系数
[cH1,cV1,cD1]=detcoef2('all',c,s,1);%尺度1的所有方向的高频系数H水平,V垂直,D对角
[cH2,cV2,cD2]=detcoef2('all',c,s,2);%尺度2的所有方向的高频系数
% wrcoef2  Reconstruct single branch from 2-D wavelet coefficients.
figure;
subplot(3,3,1); imshow(uint8(cA1));title('尺度1的低频系数图像'); %uint8的范围是0-255,转换
subplot(3,3,2); imshow(uint8(cA2));title('尺度2的低频系数图像');
subplot(3,3,4); imshow(uint8(cH1));title('尺度1水平方向高频系数图');
subplot(3,3,5); imshow(uint8(cV1));title('尺度1垂直方向');
subplot(3,3,6); imshow(uint8(cD1));title('尺度1斜线方向');
subplot(3,3,7); imshow(uint8(cH2));title('尺度2水平方向高频系数图');
subplot(3,3,8); imshow(uint8(cV2));title('尺度2垂直方向');
subplot(3,3,9); imshow(uint8(cD2));title('尺度2斜线方向');

%进行图像压缩
%第一层
cA1=wcodemat(cA1,192,'mat',0); %对矩阵进行量化编码
figure; subplot(121);
imshow(cA1,[]);  %将指定范围的灰度值变换到0-255区间显示
title('第一次压缩图像');
%第二层
cA2=wcodemat(cA2,192,'mat',0);
subplot(122); imshow(cA2,[]);
title('第二次压缩图像');
cA1=uint8(cA1);
cA2=uint8(cA2);
disp('第一次压缩后图像的大小:'); whos('cA1');
disp('第二次压缩后图像的大小:'); whos('cA2');

你可能感兴趣的:(小波分析,图像处理,matlab)