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

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]。进行滤波之后,图像会出现一条黑色的边框。

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

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

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

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

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

  1. matlab中k均值程序代码,K-均值算法Matlab仿真

    代码: X=[35 35 41 49 35 17 55 45 55 20 15 30 25 30 20 50 10 43 55 60 30 60 20 65 50 35 30 25 15 10 30 ...

  2. FPGA图像处理_中值滤波、均值滤波、极值滤波

    FPGA实现图像滤波(中值滤波.均值滤波.极值滤波) 前言 一.滤波原理 二.FPGA上Verilog实现步骤 1.图像周围填0 2.数据延迟 3.数据处理 总结 前言 首先介绍滤波原理,再附上ver ...

  3. python实现中值滤波_Python实现中值滤波去噪方式

    中值滤波器去噪: 中值滤波的主要原理是将数字图像中的某点用该点的邻域中各个像素值的中值所来代替,这样就能让目标像素周围能够更好的接近真实值,比如一张白纸上有一个黑点时,黑点的像素值比较大,经过中值滤波 ...

  4. Python 图像处理 | 图像平滑之均值滤波、方框滤波、高斯滤波及中值滤波

    作者 | 杨秀璋,责编 | 夕颜 题图  | 视觉中国 出品 | CSDN博客 本篇文章主要讲解Python调用OpenCV实现图像平滑,包括四个算法:均值滤波.方框滤波.高斯滤波和中值滤波.全文均是 ...

  5. [Python图像处理] 四十一.Python图像平滑万字详解(均值滤波、方框滤波、高斯滤波、中值滤波、双边滤波)

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

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

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

  7. 【图像处理】——图像滤波(Python+opencv实现三种方法:均值滤波、中值滤波、高斯滤波等)

    目录 一.什么是滤波以及滤波的目的? 二.均值滤波(cv2.blur()) 1.原理 2.关键代码 3.封装代码 二.中值滤波(cv2.medianBlur()) 1.原理 2.关键代码 3.封装代码 ...

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

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

  9. 《OpenCv视觉之眼》Python图像处理五 :Opencv图像去噪处理之均值滤波、方框滤波、中值滤波和高斯滤波

    本专栏主要介绍如果通过OpenCv-Python进行图像处理,通过原理理解OpenCv-Python的函数处理原型,在具体情况中,针对不同的图像进行不同等级的.不同方法的处理,以达到对图像进行去噪.锐 ...

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

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

最新文章

  1. WPF实用指南二:移除窗体的图标
  2. kafka java_Kafka 使用Java实现数据的生产和消费demo
  3. etcd使用之ttl不准确问题
  4. AutoMapper入门使用
  5. 第三方分享接口api
  6. 2013\Province_Java_C\2.组素数
  7. ELK+logback搭建日志系统
  8. 虚拟dom与diff算法 分析
  9. 解决This application failed to start because cannot find or load the qt platform plugin 'xcb'
  10. 雷声大雨点小-参加江西省网站内容管理系统培训有感
  11. 工具-VS插件Resharper快捷键
  12. VCForPython27.msi下载
  13. html文件如何添加到.net项目中中,如何在.NET中添加对mshtml版本9的引用
  14. 手把手教你学DSP(TMS320X281X) 2020-11-30
  15. RM3100 stm32 hal库 spi 磁力计数据
  16. 传智五虎是真相?受影射最重PHP学科,这几月在忙什么..?
  17. 测试学习-测试工具wireshark、HFS、wlan信号
  18. 清除html中table标签显示的数据,jquery – 数据清除tbody
  19. 解决“DNS_PROBE_FINISHED_NXDOMAIN”,访问网站打不开问题
  20. android去掉最上面的app名字(标题栏,抬头)

热门文章

  1. 基于BERT的数据库的问答系统
  2. canary??!!
  3. MySQL触发器更新和插入操作
  4. sql monitor 实践
  5. L1-7 吃鱼还是吃肉(c++)_结构体
  6. Apache POI 中文使用指南
  7. TRACE32——Go.direct
  8. 计算机视觉——图像搜索
  9. strcpy系列函数
  10. http系列 之 http认证 api认证方式 四种方式对比