线性滤波器的向量表示:

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;  }  

原图:

锐化图像:

叠加图像:

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

图像处理基本算法-滤波相关推荐

  1. 使用c语言实现图像中值滤波,图像处理之中值滤波介绍及C实现

    原标题:图像处理之中值滤波介绍及C实现 1.中值滤波概述 中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号平滑处理技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值. ...

  2. 领域平均法matlab代码实验,数字图像处理邻域平均法滤波实验报告matlab实现.doc...

    数字图像处理邻域平均法滤波实验报告matlab实现 数字图像处理 实验报告 实验三 邻域平均法滤波 学号 姓名 实验三 邻域平均法滤波 一.实验内容 选取噪声较明显的图像,分别采用3*3.5*5.7* ...

  3. PACS/RIS医学影像管理系统源码 提供先进图像处理和算法

    PACS(医学影像存档与通信系统)主要应用于医学影像的存储.传输和显示.它可以使医生突破胶片的局限,对病人的影像进行全方位的处理和观察,以便得出更准确的诊断.同时,PACS可以节省大量的胶片,降低成本 ...

  4. OpenCV-数字图像处理之中值滤波

    OpenCV-数字图像处理之中值滤波 中值滤波(median filter)在数字图像处理中属于空域平滑滤波的内容(spatial filtering).对消除椒盐噪声具有很好的效果. 数学原理 为了 ...

  5. 三种常见的图像处理双三次插值算法

    三种常见的图像处理双三次插值算法 双立方插值计算涉及16像素,间(i', j')像中的包括 小数部分的像素坐标.dx表示X方向的小数坐标.dy表示Y方向的小数坐标. 详细 能够看下图: 依据上述图示与 ...

  6. 视频教程-数字图像处理实战-算法基础

    数字图像处理实战 河海大学计算机硕士毕业,现就职于南京华为研究所,从事嵌入式软件开发工作.热爱模式识别及机器学习算法. 金圣韬 ¥70.00 立即订阅 扫码下载「CSDN程序员学院APP」,1000+ ...

  7. 【图像处理】 均值滤波、中值滤波和高斯滤波

    [图像处理] 均值滤波.中值滤波和高斯滤波 均值滤波 中值滤波 高斯滤波 结语 均值滤波 均值滤波是一种线性滤波,会导致图像模糊. 均值滤波器卷积核:卷积核中心点对应原图上的位置的值,变为卷积核覆盖的 ...

  8. 图像处理:分水岭算法(图像分割)

    图像处理:分水岭算法(图像分割) 分水岭算法 分水岭算法是一种图像区域分割法,分割的过程中将图片转化为灰度图,然后我会将灰度值看作是海拔,然后向较低点注水,这种基于地形学的解释,我们着重考虑三种点: ...

  9. 数字图像处理之平滑滤波

    数字图像处理之平滑滤波                                          by方阳 版权声明:本文为博主原创文章,转载请标出转载地址 http://www.cnblog ...

最新文章

  1. 009-回归测试的测试范围是什么?
  2. QTP中使用ExecuteFile加载vbs脚本
  3. monkeyrunner的录制与回放
  4. ccf a类期刊_喜报:我院2篇学生论文被CCFA类会议AAAI(2020)接收
  5. Java使用RSA加密解密签名及校验
  6. 为什么C4C UI上看不到新建按钮
  7. 2020牛客国庆集训派对day2 F题 Java大数处理
  8. Chrome developer tool介绍(javascript调试)
  9. 在Ruby on Rails中对nil v。空v。空白的简要解释
  10. 【学习OpenCV】—— 深入了解 cv::Mat
  11. formatter function (value,row,index){} 参数的含义
  12. fmd单片机c语言教程,ft62f08x_c语言 FMD单片机C语言列子程序 - 下载 - 搜珍网
  13. ARM、DSP、FPGA比较
  14. 【FPGA与深度学习】基于FPGA的深度学习CNN加速器设计
  15. 容器云系列之Docker容器监控cAdvisor
  16. 百度谷歌雅虎三大搜索引擎本土功能大PK
  17. STL 源码分析: RB_tree 红黑树(三) 插入和查找
  18. Linux vim 文本替换 %s/原文/替换文本/g
  19. linux关于安装tar、tar.gz、tar.xz等文件的贴士
  20. CentOS命令汇总

热门文章

  1. js 实现 复制 功能 (zeroclipboard)
  2. 在oracle中使用Trigger
  3. Android成长日记-使用GridView显示多行数据
  4. phpize增加php模块
  5. 记一次el-input使用的坑
  6. 002 模板实参推断、重载与模板
  7. Docker容器的自动化监控实现
  8. 树上倍增一些理解和写法
  9. [BZOJ] 1620: [Usaco2008 Nov]Time Management 时间管理
  10. Codeforces Beta Round #1