写在前面

中值滤波器是一种非线性滤波器,或者叫统计排序滤波器。

应用:中值滤波对脉冲噪声(如椒盐噪声)的抑制十分有用。

缺点:易造成图像的不连续性。

原理

原理很简单,如果一个信号是平缓变化的,那么某一点的输出值可以用这点的某个大小的邻域内的所有值的统计中值来代替。这个邻域在信号处理领域称之为窗(window)或者模板(Mask)。模板开的越大,输出的结果就越平滑,但也可能会把我们有用的信号特征给抹掉。所以窗的大小要根据实际的信号和噪声特性来确定。

通常我们会选择窗的大小使得窗内的数据个数为奇数个,之所以这么选是因为奇数个数据才有唯一的中间值。

排序

既然要求中值,那么就要对数据进行排序。常用的排序方法有7中如:冒泡、选择、插入、快速排序、堆、希尔排序等等,具体可以看:C排序|菜鸟教程、http://yansu.org/2015/09/07/sort-algorithms.html和常用排序算法总结(性能+代码)。下面的代码中用的是改进后的冒泡排序法。

效果

            

代码

#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>///
///排序算法-冒泡排序(改进后)
///
void bublle_sort(std::vector<int> &arr){bool flag=true;for (int i = 0; i < arr.size() - 1; ++i){while (flag){flag = false;for (int j = 0; j < arr.size() - 1 - i; ++j){if (arr[j]>arr[j + 1]){int tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;flag = true;}}}}
}//中值滤波
///
void MedianFilter(cv::Mat& src, cv::Mat& dst, cv::Size wsize){//图像边界扩充if (wsize.width % 2 == 0 || wsize.height % 2 == 0){fprintf(stderr, "Please enter odd size!");exit(-1);}int hh = (wsize.height - 1) / 2;int hw = (wsize.width - 1) / 2;cv::Mat Newsrc;cv::copyMakeBorder(src, Newsrc, hh, hh, hw, hw, cv::BORDER_REFLECT_101);//以边缘为轴,对称dst = cv::Mat::zeros(src.rows, src.cols, src.type());//中值滤波for (int i = hh; i < src.rows + hh; ++i){uchar* ptrdst = dst.ptr(i - hh);for (int j = hw; j < src.cols + hw; ++j){std::vector<int> pix;for (int r = i - hh; r <= i + hh; ++r){const uchar* ptrsrc = Newsrc.ptr(r);for (int c = j - hw; c <= j + hw; ++c){pix.push_back(ptrsrc[c]);}}bublle_sort(pix);//冒泡排序ptrdst[j - hw] = pix[(wsize.area() - 1) / 2];//将中值映射到输出图像}}
}int main(){cv::Mat src = cv::imread("I:\\Learning-and-Practice\\2019Change\\Image process algorithm\\Img\\salt.tif");if (src.empty()){return -1;}if (src.channels() > 1)cv::cvtColor(src, src, CV_RGB2GRAY);cv::Mat dst;cv::Mat dst1;cv::Size wsize(5 ,5);double t2 = (double)cv::getTickCount();MedianFilter(src, dst, wsize); //中值滤波t2 = (double)cv::getTickCount() - t2;double time2 = (t2 *1000.) / ((double)cv::getTickFrequency());std::cout << "my_process=" << time2 << " ms. " << std::endl << std::endl;cv::namedWindow("src");cv::imshow("src", src);cv::namedWindow("dst");cv::imshow("dst", dst);//cv::imwrite("I:\\Learning-and-Practice\\2019Change\\Image process algorithm\\Image Filtering\\MedianFilter\\salt.jpg",dst);cv::waitKey(0);
}

中值滤波原理及c++实现相关推荐

  1. 中值滤波原理及其代码实现

    本文主要是对高斯滤波,中值滤波原理进行简单介绍,随后用代码实现高斯噪声和椒盐噪声.以及用高斯滤波和中值滤波对这两种图像进行相关的处理. 高斯噪声:就是服从高斯正态分布的噪声,通常是因为高温或者是传感器 ...

  2. 中值滤波原理及其C++实现与CUDA优化

    对于数字图像的去噪,前边我们讲了均值滤波算法与高斯滤波算法,此外很常见的还有中值滤波算法,这些滤波算法都属于空间滤波,即对于每一个像素点,都选取其周围矩形区域中的像素点来计算滤波值.最近在项目中要使用 ...

  3. matlab图像处理-中值滤波原理

    中值滤波原理   中值滤波本质上是一种统计排序滤波器.对于原图像中某点(i,j),中值滤波以该点为中心的邻域内的所有像素的统计排序中值作为(i,j)点的响应.   中值不同于均值,是指排序队列中位于中 ...

  4. java 中值滤波_matlab图像处理-中值滤波原理(示例代码)

    中值滤波原理 ??中值滤波本质上是一种统计排序滤波器.对于原图像中某点(i,j),中值滤波以该点为中心的邻域内的所有像素的统计排序中值作为(i,j)点的响应. ??中值不同于均值,是指排序队列中位于中 ...

  5. 基于FPGA的图像中值滤波原理与实现

    图像中值滤波的FPGA实现 项目简述 中值滤波器原理 中值滤波器的实现 测试模块的代码 仿真结果 下板结果 总结 项目简述 中值滤波器在去除尖端噪声中非常重要,是信号处理中最长用到的滤波器.图像中的一 ...

  6. 中值滤波原理及MATLAB算法实现

    中值滤波是一种非线性滤波方式,它依靠模板来实现. 对于一维中值滤波,设模板的尺寸为 M ,M=2*r+1,r为模板半径,给定一维信号f(i),i = 1,2,3--N,则中值滤波输出为: g(i) = ...

  7. 中值滤波原理及matlab实现代码

    一.基本原理 上述均值滤波虽然可以降低噪声,但是也会导致图像模糊.而中值滤波在一定条件下可以克服线性滤波带来的图像细节模糊的问题,它对处理椒盐噪声非常有效. 中值滤波通常采用一个含有奇数个点的滑动窗口 ...

  8. 动态二维码中值滤波处理_使用中值滤波原理过滤异常数据

    最近有一个程序需要做一些数据分析,遇见一个求平均值的需求.数据序列由传感器输出类似如下:[10,12,11,25,9,10,9,45,13,12,10,11,78,12,12,13,10,9].在这个 ...

  9. 中值滤波与高斯滤波的原理和应用场合

    中值滤波属于非线性滤波的一种,高斯滤波属于线性滤波的一种.在Opencv中有高斯滤波的函数,但是中值滤波需要通过排序实现. 一.中值滤波 原理:中值滤波使用一个围绕当前像素的矩形,查找区域内像素的中值 ...

最新文章

  1. Python 典型错误及关键知识点
  2. VTK:相互作用之KeypressObserver
  3. PHP面试题:你所知道的php数组相关的函数?
  4. proxomitron 个人代理工具
  5. android 获取4g信号_5G与1G、2G、3G、4G有何不同
  6. 游侠怎么设置java路径_Java获取当前路径的代码
  7. Python缩小图像
  8. Linux系统管理_附加控制权限-Redhat Enterprise 5
  9. 软件过程— 螺旋模型
  10. Android6.0之AMS启动app中篇之创建app进程
  11. 数学建模之数据包络分析(评价投入产出比的模型)
  12. java 设置字符串编码_Java字符编码设置总结
  13. 国外知名音视频领域的科技公司
  14. 【工程应用】用Redis存储特征
  15. 真的不建议学Python,煞笔才学习Python,学Python难?两个小时足够搞定
  16. winfows 切换 双屏_Win10系统如何设置双屏显示?windows10设置双屏显示的方法
  17. AI路径查找器的使用
  18. AF pdaf tuning <1>
  19. UWP 和 WPF 对比
  20. MATLAB sin和sind的区别

热门文章

  1. 基于C的双声道PCM文件数据处理
  2. android 双击点赞动画,模仿android版instagram双击点赞效果
  3. Python绘制加强版K线图:增加均线及成交量
  4. 利用MATLAB中 MuPADNotebook组件将程序语言表达式转为数学表达式
  5. CAD钣金展开AutoLisp开发
  6. 网页版贪吃蛇(HTML 5)
  7. vue项目基于pdfjs-dist实现PDF简易版阅读器
  8. Linux系统里如何彻底的清空终端屏幕?
  9. FANUC机器人SYST-066示教器通讯错误报警
  10. 【第一CAD】“布局”的使用@外挂技术部