单片机/MCU论坛
直播中

李颜

7年用户 1385经验值
私信 关注
[文章]

小波分析应用在图像处理去噪及压缩

前言
本篇把小波分析应用在图像处理中的去噪以及压缩进行了简单介绍与实例应用,不过由于知识储备还有限,有些专业知识还是无法详细的表述出来,所以感兴趣的需要自行查资料学习了,公式看多了,看着是真滴懵.....

~Show time~
图像噪声
关于图像的噪声,可以这样理解:妨碍眼睛或者视觉传感器对接收到的图像进行理解或分析的因素,例如透过窗户看窗外的风景,但是却有一层“雾水”使得窗外风景在你眼中变得朦胧,窗外实际的风景显然不是如此的,所以这层“雾水”就相当于噪声了。

一般噪声是不可预测的随机信号,只能用概率统计的方法去认识,但是图像噪声又不可忽视,它存在于图像处理的输入、采集、处理的各环节以及输出结果的整个过程,特别是图像的输入、采集部分,该部分的噪声是个很关键的因素,如果输入的时候就跟随着较大噪声,之后的环节也将受到影响。因此一个良好的图像处理系统,都会将减少前级噪声作为一个主要的目标,去噪是图像处理中极为重要的步骤,由于噪声并不能完全去除,因此也可以称作是降噪。

去噪步骤
二维图像信号用二维小波分析的去噪步骤含三步,即:
1)、对图像信号s进行小波分解:选择好小波以及小波分解的层次N,然后计算图像信号s到第N层的分解。
2)、对高频系数进行阈值量化:从1到N的每一层,选择一个阈值,并对该层的高频系数进行软阈值量化处理。
3)、二维小波的重构:根据小波分解的第N层的低频系数和经过阈值量化处理的从第一层到第N层的各层高频系数,将二维信号进行小波重构。
在以上的三个步骤中,选取阈值以及阈值量化处理是重点,以下进行实例操作,其中用到的ddencmp和wdencmp是matlab的去噪函数,具体如下:

应用实例
close all;
clear all;
clc;
load tire;%载入系统提高的图像信息,会以变量X存储图像基本信息,map存储颜色信息%生成噪声
init=3535353535;
rng(init,'v4');%使用v4生成器固定rand的随机数
Xnoise=X+62*(rand(size(X)));%将信号与噪声叠加
colormap(map);%将图片上色
subplot(221);image(X);
title('原始图像X');
axis square;%保持方形
subplot(222);
image(Xnoise);
title('含噪图像Xnoise');
axis square;
[c,s]=wavedec2(Xnoise,2,'sym5');%使用小波sym5,对图像进行二层分解[THR,SORH,KEEPAPP]=ddencmp('den','wv',Xnoise);%计算去噪的默认阈值等[Xdenoise,CXC,LXC,PERF0,PERFL2]=wdencmp('gbl',c,s,'sym5',2,THR,SORH,KEEPAPP);
subplot(2,2,[3,4]);
image(Xdenoise);
title('去噪后的图像Xnoise');
axis square;
运行结果

上述实例,在原图中加入了一个随机噪声,可以看到降噪处理后的图相比加噪时的图,减少了很多散点,不过原图中的一些像素信息也随之滤除,所以相比原图就没有了那么清晰,当然这也和参数有关系,具体可以自行尝试下。
由于图像含有的噪声主要是白噪声,而且主要集中在图像的高频部分,所以可以简单粗暴的将图像中的高频部分全部滤除,从而实现图像的去噪,接下来再加一个更大的噪声进行观察,示例如下:

应用实例
close all;
clear all;
clc;
load tire;%载入图像数据
subplot(221);
image(X);
colormap(map);
title('原始图像');
axis square;init=1212121212;
rng(init,'v4');%使用v4生成器固定rand的随机数
Xnoise=X+100*(rand(size(X)));%将信号与噪声叠加
subplot(222);
image(Xnoise);
title('含噪图像Xnoise');
axis square;%降噪[c,s]=wavedec2(Xnoise,2,'sym5');Xdenoise1=wrcoef2('a',c,s,'sym5');subplot(223);
image(Xdenoise1);
title('第一次去噪结果');
axis square;
Xdenoise2=wrcoef2('a',c,s,'sym5',2);subplot(224);image(Xdenoise2);
title('第二次去噪结果');
axis square;

运行结果

从以上的结果中可以看到,相比原图,第一次的去噪处理成功滤掉了大部分的高频噪声,但是依然还有部分噪声残余;第二次的去噪处理,则在第一次去噪的基础上,再次进行去噪处理,去掉了其中的高频部分,所得结果相比第一次去噪后的图更加平滑一些,失真度也在一定程度上加大了。

图像压缩
基于小波分析的图像压缩方法比较多,有小波包、小波变换零树压缩、小波变换矢量量化压缩等,接下来介绍一个压缩的方法,步骤如下:
1)、对图像进行小波分解,获取不同频率的系数,相当于获得不同分辨率的子图像;
2)、由于高频,即高分辨率的子图像大部分的数据值很小,近于0,越高频,该种现象就越明显,所以图像最主要的部分在低频部分,这也是去噪时为什么敢大胆的去除高频部分(当然阈值不能乱设,不然图像信息丢失太多,也会严重失真,那也没法很好的进行图像分析等其他环节)。
直接进行举个例子看下效果:

应用实例
close all;
clear;
clc;
load wbarb;%载入图像
subplot(221);
image(X);
colormap(map);
title('原始图像');axis square; disp('原始图像X的大小:');
whos('X')%列出变量名字、大小、类型%%参数准备 [c,s]=wavedec2(X,2,'bior3.7');%对图像进行2层小波分解
ca1 = appcoef2(c,s,'bior3.7',1);%提取小波分解结构中的第一层的低频系数和高频系数
ch1 = detcoef2('h',c,s,1);%水平方向
cv1 = detcoef2('v',c,s,1);%垂直方向
cd1 = detcoef2('d',c,s,1);%斜线方向 %重构各频率成分的子图像 a1=wrcoef2('a',c,s,'bior3.7',1);
h1=wrcoef2('h',c,s,'bior3.7',1);
v1=wrcoef2('v',c,s,'bior3.7',1);
d1=wrcoef2('d',c,s,'bior3.7',1);
c1=[a1,h1;v1,d1]; %显示各频率成分的子图像
subplot(222);image(c1);
axis square;title('分解后各频率子图像'); %% 图像压缩 %保留小波分解的第一层信息,并进行图像压缩
ca1=wcodemat(ca1,440,'mat',0);%量化编码
ca1=0.5*ca1;%改变图像值大小,改变图像高度 subplot(223);
image(ca1);
colormap(map);
axis square;title('第一次压缩');
disp('第一次压缩后的图像大小:');
whos('ca1'); %保留小波分解的第二层信息,并进行图像压缩
ca2 = appcoef2(c,s,'bior3.7',2);
ca2 = wcodemat(ca2,440,'mat',0);
ca2=0.25*ca2;
subplot(224);
image(ca2);
colormap(map);
axis square;
title('第二次压缩');
disp('第二次压缩后的图像大小:');
whos('ca2');
运行结果结果1

结果2
从结果1可以看到两次压缩后,图像变量的大小都很明显的有了减少,压缩比例相比原图,依次为约为1/3和1/12;

从结果2中的第二幅图也可看出,图像的有效信息更多的还是集中在低频部分;对比第一第二次的压缩图,第一次的压缩效果会好一些,看上去失真度低,第二次压缩的时候,相当于在第一次的基础上再次压缩,压缩的比例较大,所以失真度就比较高一些了,继续进行小波分解第三层、第四层依然可以,理论上是可以任意进行比例的压缩,不过显然压缩越高,失真度越大,达到一定程度,基本上图片也看不出什么有效信息了。

结语
在以上的程序中用到一些函数,第一眼可能会感到陌生,这些函数我没有像以前的篇章那样有详细的介绍其使用,本篇的使用方式也只是该函数的一部分方式,所以一定要学会“help”;还有就是在写这种程序的时候,一定要记得函数的维度....,在调试的时候,我就一不小心就使用了一维的函数,那个“2”忘记写了,懵逼了许久才反应过来。。。


回帖(1)

李慎梓

2021-3-29 18:17:07
很不错的经验,感谢分享
举报

更多回帖

发帖
×
20
完善资料,
赚取积分