一.算法原理

简单的说:以一个3*3的模板划过一幅图像,以像素1到像素9的中位数代替像素5的值。这种滤波的比较适合椒盐噪声这种情况。因为椒盐的值无非是0或255.

二.需要知道的几个知识点

1.希尔排序法:

由于要找到9个数中的中位数,所以需要将9个像素进行排序,当然简单的插入排序法也可以进行排序,这里介绍一种希尔排序法。http://www.iqiyi.com/v_19rrhzyejc.html 这是当时本人学习希尔排序看的视频。https://www.cnblogs.com/chengxiao/p/6104371.html这个帖子讲的也是不错的

希尔排序法简单的来说选取一个步长从第一个数开始间隔步长个数选取先进行直接排序,步长不为1的时候不会得到顺序排列的数组只会得到一个更加有序的数组直到步长为1的时候才能得到顺序排列的数组。

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];//返回中值 
}

如果for循环转不出来,不要犯懒可以跟我一样用笔转一圈。

跟着走一圈这个排序差不多就出来了。

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(i, j)[0] = 255;
  image.at(i, j)[1] = 255;
  image.at(i, j)[2] = 255;
 }
}  这个函数就是随机在行列里产生255的值入参为一个mat 类图像的变量和究竟要多少椒盐点

三.程序源码

#include
#include
#include
#include  
#include 
using namespace cv;
using namespace std;
//求九个数的中值 
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(i, j)[0] = 255;
  image.at(i, j)[1] = 255;
  image.at(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
  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(i, j)[0] = Median(src.at(i, j)[0], src.at(i + 1, j + 1)[0],
     src.at(i + 1, j)[0], src.at(i, j + 1)[0], src.at(i + 1, j - 1)[0],
     src.at(i - 1, j + 1)[0], src.at(i - 1, j)[0], src.at(i, j - 1)[0],
     src.at(i - 1, j - 1)[0]);
    _dst.at(i, j)[1] = Median(src.at(i, j)[1], src.at(i + 1, j + 1)[1],
     src.at(i + 1, j)[1], src.at(i, j + 1)[1], src.at(i + 1, j - 1)[1],
     src.at(i - 1, j + 1)[1], src.at(i - 1, j)[1], src.at(i, j - 1)[1],
     src.at(i - 1, j - 1)[1]);
    _dst.at(i, j)[2] = Median(src.at(i, j)[2], src.at(i + 1, j + 1)[2],
     src.at(i + 1, j)[2], src.at(i, j + 1)[2], src.at(i + 1, j - 1)[2],
     src.at(i - 1, j + 1)[2], src.at(i - 1, j)[2], src.at(i, j - 1)[2],
     src.at(i - 1, j - 1)[2]);
   }
   else
    _dst.at(i, j) = src.at(i, j);
  }
 _dst.copyTo(dst);//拷贝 
}

void main()

{
 Mat image = imread("fzh.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("原图", image);
 imshow("自定义中值滤波处理后", image3);
 imshow("openCV自带的中值滤波", image4);
 waitKey(); 
}

四.实现效果图

OpenCv学习篇——图像中值滤波算法相关推荐

  1. OpenCV图像处理专栏九 | 基于直方图的快速中值滤波算法

    转载自:https://zhuanlan.zhihu.com/p/98092747  侵删 前言 这是OpenCV图像处理专栏的第9篇文章,主要介绍一个基于直方图的快速中值滤波算法,希望对大家有帮助. ...

  2. NR基础篇下——中值滤波、多级中值滤波、多级中值混合滤波、加权中值滤波、中值有理滤波

    上一篇分享了一些均值滤波相关的算法,均值滤波作为一种线性滤波器,在滤除噪声的同时也会导致边缘模糊问题.而且均值滤波对高斯噪声的效果很好,但是对于椒盐噪声的效果就很一般.但是中值滤波作为一种顺序滤波器, ...

  3. 滑动窗口滤波 c语言,关于中值滤波算法,以及C语言实现(转)

    1.什么是中值滤波? 中值滤波是对一个滑动窗口内的诸像素灰度值排序,用其中值代替窗口中心象素的原来灰度值,它是一种非线性的图像平滑法,它对脉冲干扰级椒盐噪声的抑制效果好,在抑制随机噪声的同时能有效保护 ...

  4. 关于中值滤波算法,以及C语言实现(转)

    源:关于中值滤波算法,以及C语言实现 1.什么是中值滤波? 中值滤波是对一个滑动窗口内的诸像素灰度值排序,用其中值代替窗口中心象素的原来灰度值,它是一种非线性的图像平滑法,它对脉冲干扰级椒盐噪声的抑制 ...

  5. 高效快速中值滤波算法c语言,快速中值滤波及c语言实现.docx

    . .. 快速中值滤波及c语言实现 学生姓名: 刘 勇 学 号: 6100410218 专业班级: 数媒101 [摘要]本文讨论了用c语言在微机上实现中值滤波及快速算法,在程序设计的过程中充分考虑到程 ...

  6. 图像中值滤波python代码_图像中值滤波FPGA实现

    C语言实用数字图像处理.pdf6.34 MB05-11-13|19:30 FPGA实验报告-李炎东.doc633.66 kB16-01-14|10:28 中值滤波在红外成像引信中的应用及硬件实现.ca ...

  7. matlab中基于十字形窗口的滤波算法,#215;字形滤波窗口在Matlab自适应中值滤波算法中的应用 - 21ic中国电子网...

    由于种种原因,图像在生成.传输.变换等过程中往往会受到各种噪声的污染,从而导致图像质量退化.噪声信号的滤波是图像处理的基本任务之一,主要有线性滤波和非线性滤波两种方法.线性滤波方法一般具有低通特性,而 ...

  8. Python扩展库scipy中值滤波算法的应用

    中值滤波是数字信号处理.数字图像处理中常用的预处理技术,特点是将信号中每个值都替换为其邻域内的中值,即邻域内所有值排序后中间位置上的值.下面的代码演示了scipy库中signal模块的中值滤波算法的用 ...

  9. 实时高速实现改进型中值滤波算法_爱学术_免费下载

    [摘要]在图像采集和处理过程中会引入噪声,必须先对图像进行预处理.本文介绍一种快速中值滤波算法,该算法在硬件平台上实现实时处理功能.综合考虑,选择现场可编程门阵列(FPGA)作为硬件平台,采用硬件描述 ...

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

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

最新文章

  1. 用PROCEDURE ANALYSE优化MYSQL表结构
  2. linux find命令中-print0和xargs中-0的用法
  3. xml教程之java解析xml文档
  4. Spring的Autowired自动装配(XML版本+Annotation版本+源码+解析)
  5. Java中的类型推断和lambda表达式
  6. pythonista3安卓_Pythonista 3 app下载
  7. 23种设计模式之原型模式代码实例
  8. MySQL工作笔记-建表时为Float型数据确定精度,查询时精度显示,多列之和查询
  9. Oracle11gR2下搭建DataGuard主备同步详解
  10. 国外大神一张图学会python-关于可以访问国外网站的浏览器的阿里云论坛用户知识和技术交流...
  11. linux进阶之Tomcat服务篇
  12. 5.Magento资源配置(Setup Resource)
  13. 阶段3 2.Spring_06.Spring的新注解_6 Qualifier注解的另一种用法
  14. ipynb--pdf
  15. java生成小程序二维码
  16. 计算机管理单元受到策略限制怎么解决,组策略编辑器管理单元无法打开
  17. bios属于计算机软件系统吗,装系统必须知道的BIOS,到底是什么?
  18. 4、docker中设置elasticsearch、kibana用户名密码、修改密码
  19. 使用downloadm3u8和ffmpeg下载m3u8格式视频
  20. 山东大学计算机考研压分,很坑!考研院校:这些骚操作,你不得不防

热门文章

  1. python 定时任务 全局变量_Python定时任务框架APScheduler原理及常用代码
  2. python json格式转换后,中文乱码
  3. linux设备驱动(一)
  4. FLUENT 流体计算应用教程
  5. 网络安全审核(ISO 19011)
  6. HTTP协议的工作原理
  7. windows server 2008 R2开启ftp服务
  8. 服务端技术进阶(三)从架构到监控报警,支付系统的设计如何步步为营
  9. 基本存款账户编号怎么查_基本存款账户编号是行号吗?
  10. 阿里云的这群疯子(转载)