技术标签: matlab python 机器学习 计算机视觉 opencv
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
subplot(2,3,3);imshow(K1);
title('改进后的图像1');
subplot(2,3,4); imshow(K2);
title('改进后的图像2');
subplot(2,3,5);imshow(K3);
title('改进后的图像3');
PS:filter2用法:filter2用法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。
实验二:二维自适应维纳滤波对高斯噪声的滤除效果
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]); %对加噪图像进行二维自适应维纳滤波
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:维纳滤波的两个函数wiener2与deconvwnr都能够完成维纳滤波的功能, deconvwnr强调图象复原方面,wiener2强调图象空间域锐化的作用,其中J=wiener2(I,[m,n])返回有噪声图像I经过wierner(维纳)滤波后的图像,[m,n]指定滤波器窗口大小为m*n,默认值为3*3,J=wiener2(I,[m,n],noise)指定噪声的功率,[J,noise]=wiener2(I,[m,n])在图像滤波的同时,返回噪声功率的估计值noise。:
维纳滤波的两个函数wiener2与deconvwnr都能够完成维纳滤波的功能, deconvwnr强调图象复原方面,wiener2强调图象空间域锐化的作用,其中J=wiener2(I,[m,n])返回有噪声图像I经过wierner(维纳)滤波后的图像,[m,n]指定滤波器窗口大小为m*n,默认值为3*3,J=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。
参数type和parameters用于确定噪声的类型和相应的参数。
下面的命令是对图像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对受椒盐噪声干扰的图像滤波
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('维纳滤波后的图像');
PS:MATLAB中提供了卷积运算的函数命令conv2,其语法格式为:
:MATLAB
中提供了卷积运算的函数命令conv2,其语法格式为:
C = conv2(A,B)
C = conv2(A,B)返回矩阵A和B的二维卷积C。若A为ma×na的矩阵,B为mb×nb的矩阵,则C的大小为(ma+mb+1)×(na+nb+1)。
MATLAB图像处理工具箱提供了基于卷积的图象滤波函数filter2,filter2的语法格式为:
Y = filter2(h,X)
其中Y = filter2(h,X)返回图像X经算子h滤波后的结果,默认返回图像Y与输入图像X大小相同。例如:
其实filter2和conv2是等价的。MATLAB在计算filter2时先将卷积核旋转180度,再调用conv2函数进行计算。
Fspecial函数用于创建预定义的滤波算子,其语法格式为:
h = fspecial(type)
h = fspecial(type,parameters)
参数type制定算子类型,parameters指定相应的参数,具体格式为前文已有叙述。
ones产生全1数组,zeros产生全零数组。
ones(a,b)产生a行b列全1数组
ones(a)产生a行a列全1数祖
通过图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('椒盐噪声滤波后的图像');
subplot(2,3,4);imshow(J2);
title('加高斯噪声后的图像');
J3= ordfilt2(J2,5,ones(3,4));
subplot(2,3,5);imshow(J3);
title('高斯噪声滤波后的图像');
PS:MATLAB小波分析工具箱提供的用于图像去噪的函数有wrcoef2和wpdencmp,其语法格式分别为:
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的最佳小波包分解结构;perfl2和perf0表示L^2复原和压缩百分数;perf12=100*(xd的小波包系数向量范数/X的小波包系数向量范数) ^2。Keepapp=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);
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('第二次去噪图像');
实验六:利用wpdencmp函数进行图像去噪
其程序代码如下:
PS:在MATLAB图像处理工具箱中,提供了medfilt2函数用于实现中值滤波。
Medfilt2函数的语法格式为:
B = medfilt2(A) 用3×3的滤波窗口对图像A进行中值滤波。
B = medfilt2(A,[m n]) 用指定大小为m×n的窗口对图像A进行中值滤波。
作者:余章琪,就职于飞利信科技股份有限公司,担任物联网平台架构师,拥有18年编程经验。2014年至2016年参与了镇海智慧水务项目从解决方案设计到最终实施完成的全过程。目前致力于物联网云平台的规划与设计。 责编:贾维娣([email protected]),转载请微信联系 jiaweidi1214项目简介宁波市镇海区智慧水务项目建设内容包括水环境治理设施监测、水务信息资源中心、水务综合监管...
Eclipse连接Hadoop一、实验目的1.通过Eclipse连接Hadoop2.用Eclipse对HDFS进行操作二、实验原理Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。通过Eclipse的Hadoop插件可以使Eclipse对HDFS进行操作,同时,可以进行程序编写后的对集群进行MepReduce操作...
纯手工搭建webpack项目,解决单页面路由问题
转自:http://hi.bccn.net/202661/viewspace-9733.html这两个猜想是我在用程序模拟HWI时(利用几个IRQ_开头的函数,具体查看CCS的帮助文件),多次测试之后的一点想法,不保证正确,因为TI的帮助文档没去看(因为讨厌鸟语).使用软件是CCS3.1,利用其DSP/BIOS系统,这个系统的确方便.================
2002题//注意不要出现4/32007题 1.数据的范围判断 2.题目并未有具体说明区间的端点的位置。2012题#include #include #includeint notprime(int a){ int i=2,k; k=sqrt(a);//不要放在while循环里`这里写代码片` if(a==1){ return
测试Go语言的并发性能,利用之前写的接入数据库的代码,实现1000条、10000条数据的更新插入数据 update_sql.go:package mainimport( "fmt" "database/sql" _ "github.com/lib/pq" )var quit chan int = make(chan int)func checkErr(err error){ i...
快速上手依赖:安装 docker 环境。快速搭建 jaegerdocker run -d --name jaeger \ -e COLLECTOR_ZIPKIN_HTTP_PORT=9411 \ -p 5775:5775/udp \ -p 6831:6831/udp \ -p 6832:6832/udp \ -p 5778:5778 \ -p 16686:16686 ...
今天分享一下用netty框架实现与PLC实现数据通讯。期间碰到了一些坑,留作自己的笔迹,同步分享。 本案例是在spring boot框架 搭建了netty框架。与PLC对接最大的坑就是16进制的转换。PLC中的数据基本都是16进展形式,对于服务器端获取到数据后,需要将16进制的数据转换成字符格式。下面我描述一下整个读写过程。 首先,获取PLC寄存器地址数据。要获取PLC寄存器地...
获取别人家iOS项目中的图片资源字数469阅读134评论0喜欢5前言拿起手机,将网络断开,打开一个软件,此时该软件所展示的图片,就是该项目中所包含的图片资源,如果我想在自己的项目中使用这些图片,该怎么破呢,不要急,再次我帮助大家来获取这些藏在iOS项目中的图片。如果你不满足仅仅获取项目中的,还想获取人家的网络资源,移步到Charles 从入门到精通开工在Mac...
我们经常会遇到这样的问题,就是如何使用自己的数据集,把标签和图片对应起来,然后转化成一个一个批次送进网络。其实在pytorch中已经为我们封装好了各种库,只需要我们添加相应的处理就好。import torch.utils.data #子类化数据import torchfrom tochvision import transforms #数据处理定义自己的dataset类:cla...
本文将会讲述一个完整的跨端桌面应用代码画板的构建,会涉及到整个软件开发流程,从开始的设计、编码、到最后产品成型、包装等。本文不仅仅是一篇技术方面的专业文章,更会有很多产品方面的设计思想和将技术转换成生产力的思考,我将结合我自己的使用场景完全的讲解整个开发流程,当然涉及到设计方面的不一定具有普遍实用性,多数情况下都是我自己的一些喜好,我只关心自己的需求。同时本文只从整体上讲思路,也会有个别的...
最近在移植linux,用到kernel版本为3.14.28,在高版本的内核源码中用到了设备树(device-tree),设备树中用到pinctrl的配置,记录一下。1、普通设置在配置串口时,pinctrl的配置信息如下所示:[cpp] view plain copy"font-size:14px;"