图像处理基本算法-滤波

线性滤波器的向量表示:


W是一个大小为m*n的滤波器的系数,Z为由滤波器覆盖的相应图像的灰度值。

线性滤波器所能是实现的就是乘积求和操作。

几种常见的滤波器:

平滑空间滤波器如均值滤波

统计排序滤波器如中值滤波

锐化空间滤波器如锐化滤波

1、  均值滤波

 

 

均值滤波在去噪声的同时会有如下缺点:

边界模糊效应明显

细节丢失比较严重

 

2、  中值滤波


中值滤波在边界的保存方面优于均值滤波,是经常使用的一种滤波器,但

是在模板逐渐变大时,依然会存在一定的边界模糊

中值滤波对处理椒盐噪声非常有效,或者称为脉冲噪声。

 

如果既想去除噪声,又极大的保存细节,此时应该考虑变形虫算法模板的大小是与周围的像素有关,模板随环境自动变化大小,这样在细节较小的区域可以使用较大的模板,而在细节较多的区域使用更小的模板。变形虫算法,以后再讲。

滤波器一般为盒状滤波器,能不能使用其他形状的滤波器,以得到更好的滤波效果呢?

 源代码:

    //中值滤波和均值滤波  #include<cv.h>  #include<highgui.h>  int main(){  IplImage * image,*image2,*image3;  image = cvLoadImage("E:\\image\\Dart.bmp",0);//以灰度图像的形式读入图片  cvNamedWindow("image",CV_WINDOW_AUTOSIZE);  cvNamedWindow("image2",CV_WINDOW_AUTOSIZE);  cvNamedWindow("image3",CV_WINDOW_AUTOSIZE);  //cvSaveImage("E:\\image\\moon.jpg",image,0);  cvShowImage("image",image);  //cvWaitKey(0);  unsigned char * ptr,*dst;  int i,j,m,n,sum,temp,r,s;  image2 = cvCreateImage(cvGetSize(image),image->depth,1);  image3 = cvCreateImage(cvGetSize(image),image->depth,1);  //模板1 均值   int tem[9] = {1,1,1,1,1,1,1,1,1};   //也可以使用改进的高斯模板,但是效果相近   int tem2[9] = {0};//获取中值时用于排序  //均值滤波3*3模板的均值  for( i = 0 ; i < image->height;i++){  for( j = 0; j< image->width;j++){  //边界处理  if(i == 0 || i == image->height || j == 0 || j == image->width){  ptr = (unsigned char *)image->imageData + i*image->widthStep + j;  dst = (unsigned char *)image2->imageData+ i*image2->widthStep+ j;  *dst = *ptr; //边界值赋予源图像的值  }  else {  sum = 0;  for( m = -1 ; m <= 1; m++  ){  for( n = -1 ; n <= 1 ; n++){  ptr = (unsigned char *)image->imageData + (i + m)*image->widthStep + j + n;  sum += (*ptr) * tem[3*(m+1) + n+1];  }  }  dst = (unsigned char *)image2->imageData+ i *image2->widthStep+ j;      *dst = (unsigned char)((sum +4)/9);//赋新值,四舍五入  }   }  }  //中值滤波 在去除噪声的同时,图像的模糊程度比较小,比均值滤波更加适合  //冲击噪声或者称为椒盐噪声  for( i = 0 ; i < image->height;i++){  for( j = 0; j< image->width;j++){  //边界处理  if(i == 0 || i == image->height || j == 0 || j == image->width){  ptr = (unsigned char *)image->imageData + i*image->widthStep + j;  dst = (unsigned char *)image3->imageData+ i*image3->widthStep+ j;  *dst = *ptr; //边界值赋予源图像的值  }  else {  temp = 0;  //将3*3模板覆盖的值拷贝进数组,一边查找中值  for( m = -1 ; m <= 1; m++  ){  for( n = -1 ; n <= 1 ; n++){  ptr = (unsigned char *)image->imageData + (i + m)*image->widthStep + j + n;  tem2[3*(m+1) +n +1] = *ptr;  //printf("%d",*ptr);  }  }  //对数组进行冒泡排序  for(r = 0 ; r <8; r ++){  for(s = 0 ; s< r -1; s++ ){  if(tem2[s] > tem2[s+1]){  temp = tem2[s];  tem2[s] = tem2[s+1];  tem2[s+1] = temp;  }  }  }  //printf("%d",tem2[4]);  //对新图赋予新值  dst = (unsigned char *)image3->imageData+ i *image3->widthStep+ j;      *dst = (unsigned char)(tem2[4]);//赋新值  }   }  }  cvShowImage("image2",image2);  cvShowImage("image3",image3);  cvWaitKey(0);  cvSaveImage("E:\\image\\Dart2.bmp",image2,0);  cvSaveImage("E:\\image\\Dart3.bmp",image3,0);  return 0;  }  

效果图:

原图:


均值滤波:


中值滤波:

 

可以看到,均值滤波缺点明显:

边界模糊效应明显

细节丢失比较严重

而中值滤波在保持细节方面明显优于均值滤波。

在滤波模板变大时,效果如何呢?

matlab源码:

    A = imread('Dart.bmp')  %采用中值滤波和均值滤波的比较  %模板大小的改变对滤波效果的影响  subplot(3,3,1)  imshow(A)  for n = 1 : 8   m = 2*n +1  B = medfilt2(A ,[m,m])  subplot(3,3,n+1)  imshow(B)  end  %采用均值滤波查看图像的变化  subplot(3,3,1)  imshow(A)  for n = 1 : 8   m = 2*n +1  C = imfilter(A,[m,m]);  subplot(3,3,n+1)  imshow(B)  end  

效果图:

均值滤波加大模板的效果:


中值滤波加大模板的效果:


可以看出随着模板的加大,中值滤波的模糊度也在增加,但是比均值要好很多。

3、Laplace图像锐化

锐化空间滤波器的一阶二阶微分的零交叉对于边缘定位非常有用

图像的边缘经一阶微分产生较粗的边缘

二阶微分产生由0分开的一个双边缘,这是一个适合锐化图像的理想特征。

锐化laplace算子可以突出图像中的灰度突变,但并不强调灰度缓慢变化的区域。

两种常用的Laplace模板:

0  1  0

1  -4 1

0  1  0

 

1 1 1

1 -8 1

1 1 1

 

但是得到突变的区域之后该怎么用呢?

事实上,如果源图像和laplace图像和叠加,这样既可以复原原图的背景特性,并保持laplace锐化处理的效果。这样做可以极大的增强图像的细节。

源代码:

    //锐化滤波,并利用锐化滤波增强图像的细节  #include<cv.h>  #include<highgui.h>  int main(){  IplImage * image,*image2,*image3;  image = cvLoadImage("E:\\image\\moon.tif",0);  cvNamedWindow("image",CV_WINDOW_AUTOSIZE);  cvNamedWindow("image2",CV_WINDOW_AUTOSIZE);  cvNamedWindow("image3",CV_WINDOW_AUTOSIZE);  cvSaveImage("E:\\image\\moon.jpg",image,0);  cvShowImage("image",image);  //cvWaitKey(0);  unsigned char * ptr,*dst;  image2 = cvCreateImage(cvGetSize(image),image->depth,1);  image3 = cvCreateImage(cvGetSize(image),image->depth,1);  int i,j,m,n,sum;  //锐化模板  int tem[9] = {0,1,0,1,-4,1,0,1,0};   //锐化滤波  for( i = 0 ; i < image->height;i++){  for( j = 0; j< image->width;j++){  //边界处理  if(i == 0 || i == image->height || j == 0 || j == image->width){  ptr = (unsigned char *)image->imageData + i*image->widthStep + j;  dst = (unsigned char *)image2->imageData+ i*image2->widthStep+ j;  *dst = *ptr; //边界值赋予源图像的值  }  else {  sum = 0;  for( m = -1 ; m <= 1; m++  ){  for( n = -1 ; n <= 1 ; n++){  ptr = (unsigned char *)image->imageData + (i + m)*image->widthStep + j + n;  sum += (*ptr) * tem[3*(m+1) + n+1];  }  }  dst = (unsigned char *)image2->imageData+ i *image2->widthStep+ j;      *dst = (unsigned char)((sum +4)/9);//赋新值,四舍五入  }   }  }  //锐化的图像与源图像相加,但是在相加之前需要先讲锐化的值稍微降低一些  cvShowImage("image2",image2);  for( i = 0 ; i < image2->height;i++){  for( j = 0; j< image->width;j++){  ptr = (unsigned char *)image2->imageData + i*image2->widthStep + j;   *ptr = ((*ptr)+4)/5;  }  }  cvAdd(image,image2,image3,0);  cvShowImage("image3",image3);  cvWaitKey(0);  cvSaveImage("E:\\image\\moon2.jpg",image2,0);  cvSaveImage("E:\\image\\moon3.jpg",image3,0);  return 0;  }  

原图:

锐化图像:

叠加图像:

由叠加图像可知,经过锐化处理和叠加之后,图像的细节部分更加清晰。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/255547.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

20145122《Java面向对象程序设计》实验二实验报告

实验名称&#xff1a; Java面向对象程序设计 实验内容&#xff1a; 初步掌握单元测试和TDD理解并掌握面向对象三要素&#xff1a;封装、继承、多态初步掌握UML建模熟悉S.O.L.I.D原则了解设计模式 PSP时间 步骤耗时百分比需求分析1h12.5%设计1h12.5%代码实现3h37.5%测试1h12.5%分…

iOS中AutoLayer自动布局流程及相关方法

关于UIView的Layer&#xff0c;IOS提供了三个方法&#xff1a; 1、layoutSubviews 系统重写布局:在iOS5.1和之前的版本&#xff0c;此方法的缺省实现不会做任何事情(实现为空)&#xff0c;iOS5.1之后(iOS6开始)的版本&#xff0c;此方法的缺省实现是使用你设置在此view上面的co…

均值滤波 中值滤波 高斯平滑滤波

均值滤波是典型的线性滤波算法&#xff0c;它是指在图像上对目标像素给一个模板&#xff0c;该模板包括了其周围的临近像素&#xff08;以目标象素为中心的周围8个像素&#xff0c;构成一个滤波模板&#xff0c;即去掉目标像素本身&#xff09;&#xff0c;再用模板中的全体像素…

linux 安装RedisLive

为什么80%的码农都做不了架构师&#xff1f;>>> RedisLive 用来监控Redis&#xff0c;便于redis性能分析 安装步骤&#xff1a; 1.安装pip&#xff08;代码参考&#xff1a;https://github.com/pypa/pip&#xff09; 官方网站&#xff1a;https://pypi.python.org/…

高斯滤波和双向滤波的区别与联系

1. 简介 图像平滑是一个重要的操作&#xff0c;而且有多种成熟的算法。这里主要简单介绍一下Bilateral方法&#xff08;双边滤波&#xff09;&#xff0c;这主要是由于前段时间做了SSAO&#xff0c;需要用bilateral blur 算法进行降噪。Bilateral blur相对于传统的高斯blur来说…

Eclipse变量名自动补全问题 自定义上屏按键为TAB

Eclipse空格等号等都可以上屏&#xff0c;这样有时候输入变量名再按空格就会自动补全&#xff0c;非常讨厌。那么怎么办呢&#xff1f; 1.首先你的Eclipse需要装有 Eclipse plug-in development environment 和 Eclipse JDT Plug-in Developer Resources 或者直接去下载一个和…

Dreamweaver CS6 Mac破解版

介于之前小子分享的Mac版的Adobe的PS CS6和Illustrator CS6&#xff0c;有用户要求小子分享下Dreamweaver&#xff0c;小子当然乐意效劳。 Dreamweaver CS6 是世界顶级软件厂商Adobe推出的一套拥有可视化编辑界面&#xff0c;用于制作并编辑网站和移动应用程序的网页设计软件。…

【pyqt5学习】——graphicView显示matplotlib图像

目录 一、导入模块 二、自定义一个matplotlib窗口类Figure 三、利用QT_designer绘制窗口 四、写逻辑代码 五、结果展示 一、导入模块 import matplotlibmatplotlib.use("Qt5Agg") from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg from matplo…

what is ssao

说到ssao 就要从ao说起&#xff0c;ao&#xff0c;即间接环境光遮蔽技术。我们知道现实中的光线&#xff0c;除了来自太阳和电灯的直射光线以外&#xff0c;光线碰到物体以后&#xff0c;还会再次反射&#xff0c;折射&#xff0c;而再次反射折射的过程中&#xff0c;又会被其他…

【pyqt5学习】——groupBox显示matplotlib图像

目录 一、导入模块 二、创建matplotlib窗口类 三、qt_designer设计窗口 四、逻辑代码 五、结果展示 一、导入模块 import matplotlibmatplotlib.use("Qt5Agg") from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg from matplotlib.figure impor…

杭电1027Ignatius and the Princess II模拟

地址&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid1027 题目&#xff1a; Problem DescriptionNow our hero finds the door to the BEelzebub feng5166. He opens the door and finds feng5166 is about to kill our pretty Princess. But now the BEelzebub has t…

angular 使用rxjs 监听同级兄弟组件数据变化

angular 的官网给出了父子组件之间数据交互的方法&#xff0c;如ViewChild、EventEmitter 但是如果要在同级组件之间进行数据同步&#xff0c;似乎并没有给出太多的信息。 有时候我们想&#xff0c;在一个组件中修改数据之后&#xff0c;马上反映到另外一个组件中&#xff0c; …

pic

转载于:https://www.cnblogs.com/edisonxiang/p/5392651.html

OpenCV之cvSmooth函数平滑滤波

1、cvSmooth函数用法 定义原型 <span style"font-size:12px;"> void cvSmooth( const CvArr* src, CvArr* dst,int smoothtypeCV_GAUSSIAN,int param1, int param2, double param3, double param4 );</span>src:输入图像. dst:输出图像. smoot…

【python数字信号处理】——DFT、DTFT(频谱图、幅度图、相位图)

目录 一、离散时间傅里叶变换DTFT 二、离散傅里叶变换DFT 三、DFT与DTFT的关系 ​ 参考&#xff1a; 《数字信号处理》——&#xff08;一&#xff09;.DTFT、DFT(python实现)_远行者223的博客-CSDN博客python绘制频谱图DTFT&#xff0c;DFTpython绘制频谱图&#xff1a;…

ERROR:Tried to register widget id ==basemapGalleryDiv but that id is already registered解决办法

在ArcGIS Server开发中&#xff0c;遇到DIV已经被注册的情况&#xff0c;不能对原DIV内容进行更新。这里需要调用Dojo的destroyRecursive&#xff08;&#xff09;方法&#xff0c;逐个销毁该Widget下的子元素及其后代元素。然后就可以在原DIV上注册新的小部件。 示例代码&…

图像金字塔

图像金字塔被广泛用于各种视觉应用中。图像金字塔是一个图像集合&#xff0c;集合中所有的图像都源于同一个原始图像&#xff0c;而且是通过对原始图像连续降采样活得&#xff0c;直到达到某个中止条件才停止降采样。&#xff08;当然&#xff0c;降为一个像素肯定是中止条件。…

【python数字信号处理】——Z变换

目录 一、公式 二、代码 三、结果 一、公式 频域变量&#xff1a;z 时域变量&#xff1a;n 常见序列的Z变换&#xff1a;信号与系统复习归纳&#xff08;十一&#xff09;&#xff1a;Z变换例题_百把人的博客-CSDN博客_z变换例题基于东南大学陈从颜译《信号、系统和变换》和…

九宫格拼图 支持44 55等

代码下载转载于:https://www.cnblogs.com/ygcool/p/5395343.html

一体化点焊机将要取代分体式焊钳在汽车制造生产线上的使用

目前大多数汽车制造厂及相关配套钣金件厂家选用的是悬挂式点焊机及分体式焊钳&#xff0c;从焊接变压器的功率参数看&#xff0c;约70 % 为160KVA 的&#xff0c;约30 % 为200 kVA 的。原因主要有两方面&#xff0c;一是新材料如镀锌钢板、高强度钢板、铝合金板的应用&#xff…