【拜小白opencv】31-平滑处理4非线性滤波之——中值滤波

来源:互联网 发布:淘宝卖家子账号 编辑:程序博客网 时间:2024/06/16 03:35

常言道“温故而知新”,写此文章就是对自己目前学习内容的小小的总结与记录。

本文力求用最简洁的语言,详细的代码将此部分内容讲解清楚,但由于博主同样是刚刚接触OpenCV,或许表达上有些瑕疵,还望读者能够指教探讨,大家共同进步。

博主机器配置为:VS2013+opencv2.4.13+Win-64bit。

若本文能给读者带来一点点启示与帮助,我就很开心了。

=========================分割线========================

1-中值滤波

  • 中值滤波法是一种非线性平滑技术将图像的每个像素用邻域 (以当前像素为中心的正方形区域)像素的中值代替 ,常用于消除图像中的椒盐噪声
  • 与低通滤波不同的是,中值滤波对脉冲噪声有良好的滤除作用,特别是在滤除噪声的同时,能够保护信号的边缘,使之不被模糊,但它会洗去均匀介质区域中的纹理。这些优良特性是线性滤波方法所不具有的。
中值滤波能减弱或消除傅里叶空间的高频分量,同时也影响低频分量。中值滤波去除噪声的效果依赖于两个要素:邻域的空间范围和中值计算中涉及的像素数。一般说来,小于滤波器面积一半的亮或暗的物体基本上会被滤除,而较大的物体几乎会原封不动地保存下来,因此中值滤波器的空间尺寸必须根据现有的问题来进行调整。
=========================分割线======================

2-medianBlur()函数——中值滤波

OpenCV将均值滤波封装在medianBlur()函数中,作用是输入一副图像对其进行中值滤波。下面来看下medianBlur()函数的定义:
void medianBlur( InputArray src, OutputArray dst, int ksize );
参数说明
  • 参数1:输入要处理的图像。
  • 参数2:得到处理后的输出图像,与输入图像有一样的尺寸和类型。
  • 参数3:int类型的ksize,表示内核大小,必须设置为奇数。
==================分割线================

3-代码演示

/*中值滤波*/#include <opencv2/core/core.hpp>                #include <opencv2/highgui/highgui.hpp>    #include <opencv2/imgproc/imgproc.hpp>#include <iostream>   using namespace std;using namespace cv;int main(){//------------【1】读取源图像并检查图像是否读取成功------------   Mat srcImage = imread("D:\\OutPutResult\\ImageTest\\boat1.jpg");if (!srcImage.data){cout << "读取图片错误,请重新输入正确路径!\n";system("pause");return -1;}imshow("【源图像】", srcImage);//------------【2】对图像进行中值滤波处理------------   Mat dstImage;medianBlur(srcImage, dstImage, 5);//中值滤波imshow("【中值滤波】", dstImage);waitKey(0);return 0;}
========================分割线================

4-显示结果


=====================分割线===================

5-程序说明

可以发现,中值滤波可以很好保留物体的边缘信息。
=====================END===================
阅读全文
0 0
原创粉丝点击