数字图像去噪典型算法及matlab实现

简介:
数字图像去噪典型算法及matlab实现
希望得到大家的指点和帮助
图像去噪是数字图像处理中的重要环节和步骤。去噪效果的好坏直接影响到后续的图像处理工作如图像分割、边缘检测等。图像信号在产生、传输过程中都可能会受到噪声的污染,一般数字图像系统中的常见噪声主要有:高斯噪声(主要由阻性元器件内部产生)、椒盐噪声(主要是图像切割引起的黑图像上的白点噪声或光电转换过程中产生的泊松噪声)等;
目前比较经典的图像去噪算法主要有以下三种:
均值滤波算法:也称线性滤波,主要思想为邻域平均法,即用几个像素灰度的平均值来代替每个像素的灰度。有效抑制加性噪声,但容易引起图像模糊,可以对其进行改进,主要避开对景物边缘的平滑处理。
中值滤波:基于排序统计理论的一种能有效抑制噪声的非线性平滑滤波信号处理技术。中值滤波的特点即是首先确定一个以某个像素为中心点的邻域,一般为方形邻域,也可以为圆形、十字形等等,然后将邻域中各像素的灰度值排序,取其中间值作为中心像素灰度的新值,这里领域被称为窗口,当窗口移动时,利用中值滤波可以对图像进行平滑处理。其算法简单,时间复杂度低,但其对点、线和尖顶多的图像不宜采用中值滤波。很容易自适应化。
Wiener维纳滤波:使原始图像和其恢复图像之间的均方误差最小的复原方法,是一种自适应滤波器,根据局部方差来调整滤波器效果。对于去除高斯噪声效果明显。
实验一:均值滤波对高斯噪声的效果
I=imread('C:\Documents and Settings\Administrator\桌面\1.gif');%读取图像 

J=imnoise(I,'gaussian',0,0.005);%加入均值为0,方差为0.005的高斯噪声 

subplot(2,3,1);imshow(I); 

title('原始图像'); 

subplot(2,3,2); imshow(J); 

title('加入高斯噪声之后的图像'); 

%采用MATLAB中的函数filter2对受噪声干扰的图像进行均值滤波 

K1=filter2(fspecial('average',3),J)/255; %模板尺寸为3 

K2=filter2(fspecial('average',5),J)/255;% 模板尺寸为5 

K3=filter2(fspecial('average',7),J)/255; %模板尺寸为7 

K4= filter2(fspecial('average',9),J)/255; %模板尺寸为9 

subplot(2,3,3);imshow(K1); 

title('改进后的图像1'); 

subplot(2,3,4); imshow(K2); 

title('改进后的图像2'); 

subplot(2,3,5);imshow(K3); 

title('改进后的图像3'); 

subplot(2,3,6);imshow(K4); 

title('改进后的图像4'); 

PSfilter2用法
fspecial函数用于创建预定义的滤波算子,其语法格式为:
h = fspecial(type)
h = fspecial(type,parameters)
参数type制定算子类型,parameters指定相应的参数,具体格式为:
type='average'
,为均值滤波,参数为n,代表模版尺寸,用向量表示,默认值为[3,3]
type= 'gaussian'
,为高斯低通滤波器,参数有两个,n表示模版尺寸,默认值为[3,3]sigma表示滤波器的标准差,单位为像素,默认值为
0.5
type= 'laplacian'
,为拉普拉斯算子,参数为alpha,用于控制拉普拉斯算子的形状,取值范围为[0,1],默认值为0.2
type= 'log'
,为拉普拉斯高斯算子,参数有两个,n表示模版尺寸,默认值为[3,3]sigma为滤波器的标准差,单位为像素,默认值为 0.5
type= 'prewitt'
,为prewitt算子,用于边缘增强,无参数。

type= 'sobel'
,为著名的sobel算子,用于边缘提取,无参数。
type= 'unsharp'
,为对比度增强滤波器,参数alpha用于控制滤波器的形状,范围为[0,1],默认值为0.2
运行效果见图1
据我目测,使用均值滤波去噪(高斯噪声)效果选用的邻域半径越大效果越好,当然其代价也会更大,另外确切的去噪效果的好坏还需要用SNR等数据来度量。
实验二:二维自适应维纳滤波对高斯噪声的滤除效果
I=imread('C:\Documents and Settings\Administrator\桌面\1.gif'); %读取图像 

J=imnoise(I,'gaussian',0,0.005); %加入均值为0,方差为0.005的高斯噪声 

K2=wiener2(J,[3 3]); %对加噪图像进行二维自适应维纳滤波 

K2=wiener2(J,[5 5]); %对加噪图像进行二维自适应维纳滤波 

K2=wiener2(J,[7 7]); %对加噪图像进行二维自适应维纳滤波 

K2=wiener2(J,[9 9]); %对加噪图像进行二维自适应维纳滤波 

subplot(2,3,1);imshow(I); 

title('原始图像'); 

subplot(2,3,2);imshow(J); 

title('加噪图像'); 

subplot(2,3,3);imshow(K1); 

title('恢复图像1'); 

subplot(2,3,4);imshow(K2); 

title('恢复图像2'); 

subplot(2,3,5);imshow(K3); 

title('恢复图像3'); 

subplot(2,3,6);imshow(K4); 

title('恢复图像3'); 

PS维纳滤波的两个函数wiener2deconvwnr都能够完成维纳滤波的功能, deconvwnr强调图象复原方面,wiener2强调图象空间域锐化的作用,其中J=wiener2(I,[m,n])返回有噪声图像I经过wierner(维纳)滤波后的图像,[m,n]指定滤波器窗口大小为m*n,默认值为3*3J=wiener2(I,[m,n],noise)指定噪声的功率,[J,noise]=wiener2(I,[m,n])在图像滤波的同时,返回噪声功率的估计值noise
imnoise的语法格式为
J = imnoise(I,type)
J = imnoise(I,type,parameters)
其中J = imnoise(I,type)返回对原始图像I添加典型噪声的有噪图像J
参数typeparameters用于确定噪声的类型和相应的参数。
下面的命令是对图像1.gif分别加入高斯噪声、椒盐噪声和乘性噪声,其结果如图所示

实验三:对加入椒盐噪声的图像分别作均值、中值和维纳滤波
I=imread(1.gif'); 
J1=imnoise(I,'gaussian',0,0.02); 
J2=imnoise(I,'salt & pepper',0.02); 
J3=imnoise(I,'speckle',0.02); 

运行效果见图2 

I=imread('C:\Documents and Settings\Administrator\桌面\1.gif'); 

J=imnoise(I,'salt & pepper',0.02); 

%h=ones(3,3)/9;%产生3*3的全1数组 

%B=conv2(J,h);%卷积运算 

K2=filter2(fspecial('average',3),J)/255; %均值滤波模板尺寸为3 

K= medfilt2(J);%采用二维中值滤波函数medfilt2对受椒盐噪声干扰的图像滤波 

K1=wiener2(J,[3 3]); %对加噪图像进行二维自适应维纳滤波     

subplot(2,3,1);imshow(I); 

title('原始图像'); 

subplot(2,3,2);imshow(J); 

title('加噪图像'); 

subplot(2,3,3);imshow(K2); 

title('均值滤波后的图像'); 

subplot(2,3,4);imshow(K); 

title('中值滤波后的图像'); 

subplot(2,3,5);imshow(K1); 

title('维纳滤波后的图像'); 

PSMATLAB中提供了卷积运算的函数命令conv2,其语法格式为:
   C = conv2(A,B)
C = conv2(A,B)
返回矩阵AB的二维卷积C。若Ama×na的矩阵,Bmb×nb的矩阵,则C的大小为(ma+mb+1)×(na+nb+1)
MATLAB图像处理工具箱提供了基于卷积的图象滤波函数filter2filter2的语法格式为:
Y = filter2(h,X)
其中Y = filter2(h,X)返回图像X经算子h滤波后的结果,默认返回图像Y与输入图像X大小相同。例如:
其实filter2conv2是等价的。MATLAB在计算filter2时先将卷积核旋转180度,再调用conv2函数进行计算。
Fspecial
函数用于创建预定义的滤波算子,其语法格式为:
h = fspecial(type)
h = fspecial(type,parameters)
参数type制定算子类型,parameters指定相应的参数,具体格式为前文已有叙述。
ones产生全1数组,zeros产生全零数组。
ones(a,b)
产生ab列全1数组
ones(a)
产生aa列全1叔祖
运行效果见图3
   通过图3我们也可得出结论,即中值滤波对于去除椒盐噪声效果最好,而维纳滤波去除效果则较差。中值滤波对于去除椒盐噪声效果明显,是因为椒盐噪声只在画面上的部分点随机出现,而中值滤波根据数据排序,将未被污染的点代替噪声点的值的概率较大,所以抑制效果好。对点、线和尖顶较多的图像不宜采用中值滤波,因为一些细节点可能被当成噪声点。
实验四: 分别使用二维统计滤波对椒盐噪声和高斯噪声进行滤波
I=imread('C:\Documents and Settings\Administrator\桌面\1.gif'); 

J1=imnoise(I,'salt & pepper',0.004); 

subplot(2,3,1);imshow(I); 

title('原始图像'); 

subplot(2,3,2);imshow(J1); 

title('加椒盐噪声后的图像'); 

J= ordfilt2(J1,5,ones(3,4));% 进行二维统计顺序过滤 

subplot(2,3,3);imshow(J); 

title('椒盐噪声滤波后的图像'); 

J2=imnoise(I,'gaussian',0,0.004); 

subplot(2,3,4);imshow(J2); 

title('加高斯噪声后的图像'); 

J3= ordfilt2(J2,5,ones(3,4)); 

subplot(2,3,5);imshow(J3); 

title('高斯噪声滤波后的图像'); 

PS:
效果见图4
 
PSMATLAB小波分析工具箱提供的用于图像去噪的函数有wrcoef2wpdencmp,其语法格式分别为:
X=wrcoef2(‘type’,C,S,’wname’)
[xd,treed,datad,perf0,perfl2]=wpdencmp(x,sorh,N,’wname’,crit,par,keepapp)
其中,X=wrcoef2(‘type’,C,S,’wname’)返回基于小波分解结构[C,S]的小波重构图像X。参数“type”等于a表示重构近似系数;等于h表示重构水平细节系数;等于v表示重构垂直细节系数,等于d表示重构对角细节系数。
[xd,treed,datad,perf0,perfl2]=wpdencmp(x,sorh,N,’wname’,crit,par,keepapp)是通过小波包定限(阈值化),返回输入信号或图像X的除噪结果xd。输入参数中,[treed,datad]为xd的最佳小波包分解结构;perfl2perf0表示L^2复原和压缩百分数;perf12=100*(xd的小波包系数向量范数/X的小波包系数向量范数) ^2Keepapp=1表示近似系数不能阈值化,否则可以阈值化;sorh=’s’为软阈值化,h为硬阈值化。
 
实验五:利用wrcoef2函数进行图像去噪
其程序代码如下:
I=imread('C:\Documents and Settings\Administrator\桌面\1.gif'); 

J=imnoise(I,'gaussian',0,0.005); 

[c,l]=wavedec2(J,2,'sym4'); 

J1= wrcoef2('a',c,l,'sym4',1); 

J2= wrcoef2('a',c,l,'sym4',2); 

subplot(2,2,1);imshow(I); 

title('原始图像'); 

subplot(2,2,2);imshow(J); 

title('含噪图像'); 

subplot(2,2,3);imshow(J1,[]); 

title('第一次去噪图像'); 

subplot(2,2,4);imshow(J2,[]); 

title('第二次去噪图像'); 

运行结果如图5
实验六:利用wpdencmp函数进行图像去噪
其程序代码如下:
I=imread('C:\Documents and Settings\Administrator\桌面\1.gif'); 

I=im2double(I); 

subplot(2,2,1);imshow(I); 

title('原始图像'); 

J=imnoise(I,'gaussian',0,0.05); 

subplot(2,2,2);imshow(J); 

title('含噪图像'); 

thr=0.1;sorh='s'; 

crit='shannon'; 

keepapp=0; 

J1=wpdencmp(J,sorh,3,'sym4',crit,thr,keepapp); 

subplot(2,2,3);imshow(J1); 

title('全局阈值去噪图像'); 

J2=medfilt2(J1); 

subplot(2,2,4);imshow(J2); 

title('第二次去噪图像'); 

PS:MATLAB图像处理工具箱中,提供了medfilt2函数用于实现中值滤波。
Medfilt2
函数的语法格式为:
B = medfilt2(A)
       3×3的滤波窗口对图像A进行中值滤波。
B = medfilt2(A,[m n])
   用指定大小为m×n的窗口对图像A进行中值滤波。  
效果如图6
图像处理的一些学习资源:
…………


     本文转自 gaochaojs 51CTO博客,原文链接:http://blog.51cto.com/jncumter/243961,如需转载请自行联系原作者



相关文章
|
13天前
|
算法
基于WOA算法的SVDD参数寻优matlab仿真
该程序利用鲸鱼优化算法(WOA)对支持向量数据描述(SVDD)模型的参数进行优化,以提高数据分类的准确性。通过MATLAB2022A实现,展示了不同信噪比(SNR)下模型的分类误差。WOA通过模拟鲸鱼捕食行为,动态调整SVDD参数,如惩罚因子C和核函数参数γ,以寻找最优参数组合,增强模型的鲁棒性和泛化能力。
|
6天前
|
存储 算法
基于HMM隐马尔可夫模型的金融数据预测算法matlab仿真
本项目基于HMM模型实现金融数据预测,包括模型训练与预测两部分。在MATLAB2022A上运行,通过计算状态转移和观测概率预测未来值,并绘制了预测值、真实值及预测误差的对比图。HMM模型适用于金融市场的时间序列分析,能够有效捕捉隐藏状态及其转换规律,为金融预测提供有力工具。
|
6天前
|
机器学习/深度学习 算法 信息无障碍
基于GoogleNet深度学习网络的手语识别算法matlab仿真
本项目展示了基于GoogleNet的深度学习手语识别算法,使用Matlab2022a实现。通过卷积神经网络(CNN)识别手语手势,如"How are you"、"I am fine"、"I love you"等。核心在于Inception模块,通过多尺度处理和1x1卷积减少计算量,提高效率。项目附带完整代码及操作视频。
|
15天前
|
算法
基于GA遗传算法的PID控制器参数优化matlab建模与仿真
本项目基于遗传算法(GA)优化PID控制器参数,通过空间状态方程构建控制对象,自定义GA的选择、交叉、变异过程,以提高PID控制性能。与使用通用GA工具箱相比,此方法更灵活、针对性强。MATLAB2022A环境下测试,展示了GA优化前后PID控制效果的显著差异。核心代码实现了遗传算法的迭代优化过程,最终通过适应度函数评估并选择了最优PID参数,显著提升了系统响应速度和稳定性。
|
12天前
|
算法
基于WOA鲸鱼优化的购售电收益与风险评估算法matlab仿真
本研究提出了一种基于鲸鱼优化算法(WOA)的购售电收益与风险评估算法。通过将售电公司购售电收益风险计算公式作为WOA的目标函数,经过迭代优化计算出最优购电策略。实验结果表明,在迭代次数超过10次后,风险价值收益优化值达到1715.1万元的最大值。WOA还确定了中长期市场、现货市场及可再生能源等不同市场的最优购电量,验证了算法的有效性。核心程序使用MATLAB2022a实现,通过多次迭代优化,实现了售电公司收益最大化和风险最小化的目标。
|
12天前
|
算法
通过matlab对比遗传算法优化前后染色体的变化情况
该程序使用MATLAB2022A实现遗传算法优化染色体的过程,通过迭代选择、交叉和变异操作,提高染色体适应度,优化解的质量,同时保持种群多样性,避免局部最优。代码展示了算法的核心流程,包括适应度计算、选择、交叉、变异等步骤,并通过图表直观展示了优化前后染色体的变化情况。
|
9天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于深度学习网络的宝石类型识别算法matlab仿真
本项目利用GoogLeNet深度学习网络进行宝石类型识别,实验包括收集多类宝石图像数据集并按7:1:2比例划分。使用Matlab2022a实现算法,提供含中文注释的完整代码及操作视频。GoogLeNet通过其独特的Inception模块,结合数据增强、学习率调整和正则化等优化手段,有效提升了宝石识别的准确性和效率。
|
14天前
|
算法 决策智能
基于遗传优化算法的TSP问题求解matlab仿真
本项目使用遗传算法解决旅行商问题(TSP),目标是在四个城市间找到最短路径。算法通过编码、选择、交叉、变异等步骤,在MATLAB2022A上实现路径优化,最终输出最优路径及距离。
|
4月前
|
安全
【2023高教社杯】D题 圈养湖羊的空间利用率 问题分析、数学模型及MATLAB代码
本文介绍了2023年高教社杯数学建模竞赛D题的圈养湖羊空间利用率问题,包括问题分析、数学模型建立和MATLAB代码实现,旨在优化养殖场的生产计划和空间利用效率。
216 6
【2023高教社杯】D题 圈养湖羊的空间利用率 问题分析、数学模型及MATLAB代码
|
4月前
|
存储 算法 搜索推荐
【2022年华为杯数学建模】B题 方形件组批优化问题 方案及MATLAB代码实现
本文提供了2022年华为杯数学建模竞赛B题的详细方案和MATLAB代码实现,包括方形件组批优化问题和排样优化问题,以及相关数学模型的建立和求解方法。
139 3
【2022年华为杯数学建模】B题 方形件组批优化问题 方案及MATLAB代码实现