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

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

  • 数学原理

为了讲述的便捷,我们以灰度图为例。RGB三通道的彩色图可以通过每一个通道各自的中值滤波联合得到。

数字图像是以矩阵的方式存储的,具体存储方式可以参见OpenCV手册。中值滤波是通过所谓的mask operation操作进行的。以3x3的mask为例。设图像的矩阵形式如下:

0,0 0,1 0,2 0,3 0,4 0,5
1,0 1,1 1,2 1,3 1,4 1,5
2,0 2,1 2,2 2,3 2,4 2,5
3,0 3,1 3,2 3,3 3,4 3,5
4,0 4,1 4,2 4,3 4,4 4,5
5,0 5,1 5,2 5,3 5,4 5,5

图中每个方框代表一个像素,每个方框里的数字对代表该像素在图中的位置。中值滤波从位置(1,1)开始,建立一个3x3的mask

i-1,j-1 i-1,j i-1,j+1
i,j-1 i,j i,j+1
i+1,j-1 i+1,j i+1,j+1

让(1,1)与(i,j)对其,取出模板所覆盖的范围内像素值,取这九个值得中值然后赋给(1,1),作为(1,1)位置的新像素值。然后移动模板的中心(i,j)至(1,2),重复上面的操作,直至遍历整幅图片。这里面应该注意的是,我们在做中值滤波时,模板里的中值是赋给一个新建的全新图像,被滤波的图像像素值不会改变。这样就保证了每一次模板覆盖的区域都是原图像的像素。

注:

  1. mask并不一定要用3x3的矩阵来做,模板的大小不是一定的。
  2. 从上面的操作过程可以看到,在图像的最后一行和第一行,最后一列和第一列的像素都没有被遍历到,我们一般有两种方案解决这个问题。
    1. 可以将该位置的所有像素赋值为零。
    2. 可以在原图像的上下左右都加上相应的全零向量,然后再进行上述的中值滤波操作,这样所有原图的像素都可以被遍历到。
  • 基于OpenCV中值滤波程序

OpenCV中也用现成的中值滤波函数medianblur,具体用法为

medianBlur(InputArray src,OutputArray dst,int ksize);

其中InputArray src为Mat类的被滤波图片,OutputArray是Mat类的滤波后输出结果,ksize是mask的大小,如,如果用3x3的模板,ksize就传值3;

基于OpenCV的中指滤波代码段如下,

 1 //load the Original Image and get some informations2 Mat src = imread("010.jpg",1);3 namedWindow("OriginalImage");4 imshow("OriginalImage",src);5 CV_Assert(src.depth() == CV_8U);6 const int nr = src.rows;7 const int nc = src.cols;8 const int nchannels = src.channels();9
10 //OpenCV Solution
11 Mat result_opencv;
12 medianBlur(src,result_opencv,3);
13 namedWindow("median filter_opencv");
14 imshow("median filter_opencv",result_opencv);

仿真结果:

原图:

用medianBlur中值滤波的结果:

  • 基于中值滤波原理编写的中值滤波函数仿真

这次我们进行的不再是灰度图的仿真,所以有必要简单介绍一下彩色图在Mat类里保存的方式,见下图(来源:opencv.org)。

从图中我们可以看到,彩色图片中像素的三通道是保存在同一行中的,顺序是BGR。假如指针p[i]定位到的是(0,1)的蓝色通道,那么p[i+Mat.channels]定位到的就是下一列的蓝色通道。

基于中值滤波原理编写的中值滤波函数代码段如下

 1 //own median filter algorithm2 uchar* previous = NULL;3 uchar* current = NULL;4 uchar* next = NULL;5 uchar* current_result_own = NULL;6 int arr[9];   //use 3*3 mask7 for(int i=1;i<nr-1;i++)8 {9     previous = src.ptr<uchar>(i-1);
10     current = src.ptr<uchar>(i);
11     next = src.ptr<uchar>(i+1);
12     current_result_own = result_own.ptr<uchar>(i);
13     for(int j=nchannels;j<nchannels*(nc-1);j++)
14     {
15         for(int k=0;k<3;k++)
16         {
17             arr[k] = previous[j+(k-1)*nchannels];
18             arr[k+3] = current[j+(k-1)*nchannels];
19             arr[k+6] = next[j+(k-1)*nchannels];
20         }
21         bubble_sort(arr,9);
22         current_result_own[j] = arr[4];
23     }
24 }
25
26 //set the pixels on the borders to zeros
27 result_own.row(0).setTo(Scalar(0));
28 result_own.row(nr-1).setTo(Scalar(0));
29 result_own.col(0).setTo(Scalar(0));
30 result_own.col(nc-1).setTo(Scalar(0));
31
32 //show the result
33 namedWindow("median filter_own");
34 imshow("median filter_own",result_own);

其中bubble_sort是我用冒泡排序法写的排序函数,代码段如下,

 1 //************************//2 //bubble sort3 //************************//4 void bubble_sort(int* arr,int num)5 {6     int temp;7     for(int i=1;i<num-1;i++)8     {9         for(int j=0;j<num-i;j++)
10            {
11                if(arr[j]>arr[j+1])
12                {
13                    temp = arr[j];
14                    arr[j] = arr[j+1];
15                    arr[j+1] = temp;
16                }
17            }
18     }
19 }

仿真结果:

转载自:https://www.cnblogs.com/german-iris/p/4811462.html

OpenCV-数字图像处理之中值滤波相关推荐

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

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

  2. 图像处理之中值滤波介绍及C实现

    1 中值滤波概述 中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号平滑处理技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值. 中值滤波的基本原理是把数字图像或数字序 ...

  3. 数字图像处理——中值滤波及其改进算法

    一.算法介绍 中值滤波器是非线性滤波器的一个例子,它在保留图像特征方面非常有效. 但是,滤波器的窗口大小直接影响中值滤波器的性能. 较小的窗口保留了特征,但会导致噪声抑制的减少. 在较大窗口的情况下, ...

  4. 数字图像处理 中值滤波 MATLAB实验

    一.原理_中值滤波 中值滤波的基本思想是将图像中每个像素的灰度值用其邻域内像素灰度的中值代替,它是一种非线性平滑滤波算法. 设加噪图像为 f(x,y) ,经中值滤波处理后的图像为g(x,y) ,则: ...

  5. 数字图像处理——中值滤波中心加权中值滤波

    引言:在处理图像时,线性滤波将破坏边缘,而且不能有效滤除脉冲噪声.非线性滤波基于对输入信号序列的一种非线性映射关系,常可把某一特定的噪声近似映射为零而保留信号的重要特征,因而可以在一定程度上克服线性滤 ...

  6. 数字图像处理——中值滤波降噪

    使用滤波模板中像素点的中值点作为目标像素,这就称为中值滤波降噪(顾名思义) Python实现过程如下: 图像数据为: 图像中存在典型的椒盐噪声,而中值降噪,对椒盐噪声的作用是非常有效的. 导入要使用的 ...

  7. OpenCV数字图像处理基于C++:灰度变换

    OpenCV数字图像处理基于C++:灰度变换 1.1 灰度变换概念 在图像预处理中,图像的灰度变换是图像增强的重要手段,灰度变换可以使图像对比度扩展,图像清晰,特征明显,灰度变换主要利用点运算来修正像 ...

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

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

  9. 《opencv 数字图像处理 图像基础》

    <opencv 数字图像处理 图像基础> 矩阵 通道分离和合并 彩色图像转灰度图像 灰度图转二值化图像 图像运算 矩阵 定义一个显示图像的函数,对于灰度图,里面添加了vmin=0,vmax ...

最新文章

  1. 一个有趣的案例 | 页面扭曲矫正
  2. Windows Mobile Incoming Call View Custom
  3. Py之simplejson:simplejson库的简介、安装、使用方法之详细攻略
  4. HDU 1385 Minimum Transport Cost
  5. 使用LiveClick升级您的实时书签
  6. Ubuntu出现没有正确安装GNOME电源管理器的默认配置
  7. PLSQL中文显示乱码(问号)
  8. python cnn代码详解 keras_python – CNN返回相同的分类结果(keras)
  9. request_irq() | 注册中断服务【ZT】
  10. 【Linux安全】chattr命令锁定账户敏感文件
  11. hadoop中java部分练习_java私塾Hadoop实战-中高级部分 之 Hadoop RestFul
  12. 安装中文版MSDN方法
  13. MATHEMATICS FOR MACHINE LEARNING部分翻译
  14. 纯js制作的XML在线编辑器(支持修改本地文件)
  15. L298N和TB6612FNG模块控制直流电机
  16. 51单片机KEILC51的安装
  17. JavaScript:实现NQueen皇后问题算法(附完整源码)
  18. arcmap坐标点生成线和面(更正版)
  19. 我在用的翻译软件 - 微软翻译+网易有道词典+谷歌翻译
  20. 论文《Context Contrasted Feature and Gated Multi-scale Aggregation for Scene Segmentation》笔记

热门文章

  1. 物联网大数据平台应具备的功能和特点
  2. Windows上面挂载NFS共享
  3. Spring ORM示例 - JPA,Hibernate,Transaction
  4. android sdk与adt版本,eclipse中sdk与adt版本不兼容该怎么解决? 三种方法帮你搞定
  5. linux查看openjdk的安装的路径
  6. 【内容管理系统】之 Strapi
  7. 【Java】用for循环实现1+2+3......+100 =
  8. C#LeetCode刷题-脑筋急转弯
  9. C#LeetCode刷题之#707-设计链表(Design Linked List)
  10. redis-Set集合操作SADD,SMEMBERS,scard,srem