转自:openCV之中值滤波&均值滤波(及代码实现):https://blog.csdn.net/weixin_37720172/article/details/72627543

 在开始我们今天的博客之前,我们需要先了解一下什么是滤波:

openCV之中值滤波&均值滤波(及代码实现)首先我们看一下图像滤波的概念。图像滤波,即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性。

下图左边是原图右边是噪声图:

消除图像中的噪声成分叫作图像的平滑化或滤波操作。信号或图像的能量大部分集中在幅度谱的低频和中频段是很常见的,而在较高频段,感兴趣的信息经常被噪声淹没。因此一个能降低高频成分幅度的滤波器就能够减弱噪声的影响。
图像滤波的目的有两个:一是抽出对象的特征作为图像识别的特征模式;另一个是为适应图像处理的要求,消除图像数字化时所混入的噪声。
而对滤波处理的要求也有两条:一是不能损坏图像的轮廓及边缘等重要信息;二是使图像清晰视觉效果好。

平滑滤波是低频增强的空间域滤波技术。它的目的有两类:一类是模糊;另一类是消除噪音。
空间域的平滑滤波一般采用简单平均法进行,就是求邻近像元点的平均亮度值。邻域的大小与平滑的效果直接相关,邻域越大平滑的效果越好,但邻域过大,平滑会使边缘信息损失的越大,从而使输出的图像变得模糊,因此需合理选择邻域的大小。
关于滤波器,一种形象的比喻法是:我们可以把滤波器想象成一个包含加权系数的窗口,当使用这个滤波器平滑处理图像时,就把这个窗口放到图像之上,透过这个窗口来看我们得到的图像。

举一个滤波在我们生活中的应用:美颜的磨皮功能。如果将我们脸上坑坑洼洼比作是噪声的话,那么滤波算法就是来取出这些噪声,使我们自拍的皮肤看起来很光滑。

这篇博文会介绍中值滤波以及均值滤波两种算法

一.均值滤波

图片中一个方块区域(一般为3*3)内,中心点的像素为全部点像素值的平均值。均值滤波就是对于整张图片进行以上操作。

我们可以看下图的矩阵进行理解

缺陷:均值滤波本身存在着固有的缺陷,即它不能很好地保护图像细节,在图像去噪的同时也破坏了图像的细节部分,从而使图像变得模糊,不能很好地去除噪声点。特别是椒盐噪声

实现代码:

#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
#include<ctime>
using namespace cv;
using namespace std;//均值滤波
void AverFiltering(const Mat &src,Mat &dst) {if (!src.data) return;//at访问像素点for (int i = 1; i<src.rows; ++i)for (int j = 1; j < src.cols; ++j) {if ((i - 1 >= 0) && (j - 1) >= 0 && (i + 1)<src.rows && (j + 1)<src.cols) {//边缘不进行处理dst.at<Vec3b>(i, j)[0] = (src.at<Vec3b>(i, j)[0] + src.at<Vec3b>(i - 1, j - 1)[0] + src.at<Vec3b>(i - 1, j)[0] + src.at<Vec3b>(i, j - 1)[0] +src.at<Vec3b>(i - 1, j + 1)[0] + src.at<Vec3b>(i + 1, j - 1)[0] + src.at<Vec3b>(i + 1, j + 1)[0] + src.at<Vec3b>(i, j + 1)[0] +src.at<Vec3b>(i + 1, j)[0]) / 9;dst.at<Vec3b>(i, j)[1] = (src.at<Vec3b>(i, j)[1] + src.at<Vec3b>(i - 1, j - 1)[1] + src.at<Vec3b>(i - 1, j)[1] + src.at<Vec3b>(i, j - 1)[1] +src.at<Vec3b>(i - 1, j + 1)[1] + src.at<Vec3b>(i + 1, j - 1)[1] + src.at<Vec3b>(i + 1, j + 1)[1] + src.at<Vec3b>(i, j + 1)[1] +src.at<Vec3b>(i + 1, j)[1]) / 9;dst.at<Vec3b>(i, j)[2] = (src.at<Vec3b>(i, j)[2] + src.at<Vec3b>(i - 1, j - 1)[2] + src.at<Vec3b>(i - 1, j)[2] + src.at<Vec3b>(i, j - 1)[2] +src.at<Vec3b>(i - 1, j + 1)[2] + src.at<Vec3b>(i + 1, j - 1)[2] + src.at<Vec3b>(i + 1, j + 1)[2] + src.at<Vec3b>(i, j + 1)[2] +src.at<Vec3b>(i + 1, j)[2]) / 9;}else {//边缘赋值dst.at<Vec3b>(i, j)[0] = src.at<Vec3b>(i, j)[0];dst.at<Vec3b>(i, j)[1] = src.at<Vec3b>(i, j)[1];dst.at<Vec3b>(i, j)[2] = src.at<Vec3b>(i, j)[2];}}
}
//图像椒盐化
void salt(Mat &image, int num) {if (!image.data) return;//防止传入空图int i, j;srand(time(NULL));for (int x = 0; x < num; ++x) {i = rand() % image.rows;j = rand() % image.cols;image.at<Vec3b>(i, j)[0] = 255;image.at<Vec3b>(i, j)[1] = 255;image.at<Vec3b>(i, j)[2] = 255;}
}
void main() {Mat image = imread("路飞.jpg");Mat Salt_Image;image.copyTo(Salt_Image);salt(Salt_Image, 3000);Mat image1(image.size(), image.type());Mat image2;AverFiltering(Salt_Image, image1);blur(Salt_Image, image2, Size(3, 3));//openCV库自带的均值滤波函数imshow("原图", image);imshow("自定义均值滤波", image1);imshow("openCV自带的均值滤波", image2);waitKey();
}

效果图:

可以看到图片变模糊而且噪声并没有很有效的去除,该算法只是模糊化了图片而已。

二.中值滤波

首先,我们复习中值。在一连串数字{1,4,6,8,9}中,数字6就是这串数字的中值。由此我们可以应用到图像处理中。依然我们在图像中去3*3的矩阵,里面有9个像素点,我们将9个像素进行排序,最后将这个矩阵的中心点赋值为这九个像素的中值。

代码:

//求九个数的中值
uchar Median(uchar n1, uchar n2, uchar n3, uchar n4, uchar n5,uchar n6, uchar n7, uchar n8, uchar n9) {uchar arr[9];arr[0] = n1;arr[1] = n2;arr[2] = n3;arr[3] = n4;arr[4] = n5;arr[5] = n6;arr[6] = n7;arr[7] = n8;arr[8] = n9;for (int gap = 9 / 2; gap > 0; gap /= 2)//希尔排序for (int i = gap; i < 9; ++i)for (int j = i - gap; j >= 0 && arr[j] > arr[j + gap]; j -= gap)swap(arr[j], arr[j + gap]);return arr[4];//返回中值
}//图像椒盐化
void salt(Mat &image, int num) {if (!image.data) return;//防止传入空图int i, j;srand(time(NULL));for (int x = 0; x < num; ++x) {i = rand() % image.rows;j = rand() % image.cols;image.at<Vec3b>(i, j)[0] = 255;image.at<Vec3b>(i, j)[1] = 255;image.at<Vec3b>(i, j)[2] = 255;}
}//中值滤波函数
void MedianFlitering(const Mat &src, Mat &dst) {if (!src.data)return;Mat _dst(src.size(), src.type());for(int i=0;i<src.rows;++i)for (int j=0; j < src.cols; ++j) {if ((i - 1) > 0 && (i + 1) < src.rows && (j - 1) > 0 && (j + 1) < src.cols) {_dst.at<Vec3b>(i, j)[0] = Median(src.at<Vec3b>(i, j)[0], src.at<Vec3b>(i + 1, j + 1)[0],src.at<Vec3b>(i + 1, j)[0], src.at<Vec3b>(i, j + 1)[0], src.at<Vec3b>(i + 1, j - 1)[0],src.at<Vec3b>(i - 1, j + 1)[0], src.at<Vec3b>(i - 1, j)[0], src.at<Vec3b>(i, j - 1)[0],src.at<Vec3b>(i - 1, j - 1)[0]);_dst.at<Vec3b>(i, j)[1] = Median(src.at<Vec3b>(i, j)[1], src.at<Vec3b>(i + 1, j + 1)[1],src.at<Vec3b>(i + 1, j)[1], src.at<Vec3b>(i, j + 1)[1], src.at<Vec3b>(i + 1, j - 1)[1],src.at<Vec3b>(i - 1, j + 1)[1], src.at<Vec3b>(i - 1, j)[1], src.at<Vec3b>(i, j - 1)[1],src.at<Vec3b>(i - 1, j - 1)[1]);_dst.at<Vec3b>(i, j)[2] = Median(src.at<Vec3b>(i, j)[2], src.at<Vec3b>(i + 1, j + 1)[2],src.at<Vec3b>(i + 1, j)[2], src.at<Vec3b>(i, j + 1)[2], src.at<Vec3b>(i + 1, j - 1)[2],src.at<Vec3b>(i - 1, j + 1)[2], src.at<Vec3b>(i - 1, j)[2], src.at<Vec3b>(i, j - 1)[2],src.at<Vec3b>(i - 1, j - 1)[2]);}else_dst.at<Vec3b>(i, j) = src.at<Vec3b>(i, j);}_dst.copyTo(dst);//拷贝
}void main() {Mat image = imread("路飞.jpg");Mat Salt_Image;image.copyTo(Salt_Image);salt(Salt_Image, 3000);Mat image3, image4;MedianFlitering(Salt_Image, image3);medianBlur(Salt_Image, image4, 3);imshow("自定义中值滤波处理后", image3);imshow("openCV自带的中值滤波", image4);waitKey();
}

效果图:

可以看到,椒盐噪声很好的被平滑了,而且也没均值那样模糊化太过于严重。

三 填充问题

在对图像应用滤波器进行过滤时,边界问题是一个需要处理的问题。一般来说,有3种处理的方法。

1. 不做边界处理

不对图像的边界作任何处理,在对图像进行滤波时,滤波器没有作用到图像的四周,因此图像的四周没有发生改变。

2. 填充0

对图像的边界做扩展,在扩展边界中填充0,对于边长为2k+1的方形滤波器,扩展的边界大小为k,若原来的图像为[m, n],则扩展后图像变为[m+2k, n+2k]。进行滤波之后,图像会出现一条黑色的边框。

3. 填充最近像素值

扩展与 填充0 的扩展类似,只不过填充0的扩展是在扩展部分填充0,而这个方法是填充距离最近的像素的值。

四 总结:

均值滤波和和中值滤波都可以起到平滑图像,虑去噪声的功能。

均值滤波采用线性的方法,平均整个窗口范围内的像素值,均值滤波本身存在着固有的缺陷,即它不能很好地保护图像细节,在图像去噪的同时也破坏了图像的细节部分,从而使图像变得模糊,不能很好地去除噪声点。均值滤波对高斯噪声表现较好,对椒盐噪声表现较差。

中值滤波采用非线性的方法,它在平滑脉冲噪声方面非常有效,同时它可以保护图像尖锐的边缘,选择适当的点来替代污染点的值,所以处理效果好,对椒盐噪声表现较好,对高斯噪声表现较差。

参考:

1.均值滤波和中值滤波

https://blog.csdn.net/cjsh_123456/article/details/79261271

2.

图像处理:中值滤波均值滤波相关推荐

  1. matlab mean 滤波,中值和均值滤波---matlab实现(Median and mean filter ---matlab implementation).doc...

    中值和均值滤波---matlab实现(Median and mean filter ---matlab implementation) 中值和均值滤波---matlab实现(Median and me ...

  2. 滤波算法、中值和均值滤波区别

    滤波算法:  这里所讲的算法都是针对图像空间的滤波算法,其中模板,可以理解为图像形态学中的结构元素,是用来选取图像中的那些像素点被用来操作的.空间滤波根据其功能划分为平滑滤波和锐化滤波.平滑滤波:能减 ...

  3. 图像处理技术之三:降噪处理(中值、均值、最大值、最小值滤波、图像噪声)

    图像噪声的成因分类与常见图像去噪算法简介 1.图像噪声的成因 图像在生成和传输过程中常常因受到各种噪声的干扰和影响而是图像降质,这对后续图像的处理和图像视觉效应将产生不利影响.噪声种类很多,比如:电噪 ...

  4. 转载之-中值滤波均值滤波

    转自:openCV之中值滤波&均值滤波(及代码实现):https://blog.csdn.net/weixin_37720172/article/details/72627543  在开始我们 ...

  5. 图像降噪算法——中值滤波/均值滤波/高斯滤波/双边滤波

    图像降噪算法--中值滤波/均值滤波/高斯滤波/双边滤波 图像降噪算法--中值滤波/均值滤波/高斯滤波/双边滤波 1. 基本原理 2. C++代码实现 3. 结论 图像降噪算法--中值滤波/均值滤波/高 ...

  6. opencv 滤波 方框滤波 均值滤波 高斯滤波 中值滤波 双边滤波

    文章目录 一. 线性滤波 1.1. 方框滤波 demo 1.2. 均值滤波 demo 1.3. 高斯滤波 demo 二. 非线性滤波 2.1. 中值滤波 demo 2.2. 双边滤波 demo 结构体 ...

  7. OpenCV函数简记_第三章数字图像的滤波处理(方框,均值,高斯,中值和双边滤波)

    系列文章目录 OpenCV函数简记_第一章数字图像的基本概念(邻域,连通,色彩空间) OpenCV函数简记_第二章数字图像的基本操作(图像读写,图像像素获取,图像ROI获取,图像混合,图形绘制) Op ...

  8. 9、opencv 方盒、均值、高斯、中值、双边滤波 2022-08-22

    import cv2 import numpy as npimg_path = "./R-C.jpg"img = cv2.imread(img_path) 方盒滤波 # norma ...

  9. [Python图像处理] 四.图像平滑之均值滤波、方框滤波、高斯滤波及中值滤波

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

最新文章

  1. c语言中描述y是奇数,4章选择结构程序设计C语言入门习题
  2. 重启部署在Linux系统下的tomcat服务
  3. lvm扩张与收缩小结
  4. Android字体占有内存,android随意创建字体对象引发的应用程序运行时占用内存过大...
  5. mysql创建用户并授登录权限_mysql创建用户并授予权限
  6. wordpress程序安装php多少,2020最新WordPress网站程序详细安装教程
  7. 学习C++和编程的50个观点
  8. 洛谷 P3391 文艺平衡树
  9. linux安装 icc编译器,安装 Intel Compiler (ifort icc icpc)
  10. 辨异 —— 中文词汇
  11. java编程剪刀石头布_Java实现的剪刀石头布游戏示例
  12. 计算机会计学ufo报表,《计算机会计学》教学大纲.pdf
  13. java 菜刀_Java中国菜刀(Cknife)的模拟终端乱码解决方法 | 【韩涛博客】
  14. MATLAB实现图像滤波--高斯滤波
  15. 数学小故事之 被柯西坑了的两个天才数学家——阿贝尔和伽罗瓦
  16. Enjoying virus ⌒●ǒ●⌒
  17. Excel文件处理-Python之openpyxl
  18. 前后落差大用什么词语_形容两个人反差特别大的成语-有明显的反差 用什么词形容-形容前后态度反差巨大的词...
  19. 头部导航栏和底部 图片pic 字体图标设置文字大小
  20. java cmd进入目录_cmd进入某个目录

热门文章

  1. Nginx-负载均衡
  2. 获取某天到某天相隔的时间段的工作日期(包含周末上班时间)和非工作日(包括调休、国家法定节假日)
  3. 终于解决!图片随鼠标移动在FireFox下实现,另附一个好玩的图片随鼠标伸缩效果
  4. SOME/IP协议详解[7 SOME/IP序列化]
  5. 正则表达式给内容快速加双引号,单引号
  6. GBase 8c 创建用户示例说明
  7. TensorFlow实战——个性化推荐
  8. 大学生计算机论文评语简短,大学生毕业论文评语
  9. list 初始化大小
  10. HTML中如何为表格添加标题(添加的标题与表格相对静止)(tablecaption标题/caption/table)