1、什么是中值滤波?

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

中值滤波可以过滤尖峰脉冲。目的在于我们对于滤波后的数据更感兴趣。滤波后的数据保留的原图像的变化趋势,同时去除了尖峰脉冲对分析造成的影响。

以一维信号的中值滤波举例。对灰度序列80、120、90、200、100、110、70,如果按大小顺序排列,其结果为70、80、90、10O、110、120、200,其中间位置上的灰度值为10O,则该灰度序列的中值即为100。一维信号中值滤波实际上就是用中值代替规定位置(一般指原始信号序列中心位置)的信号值。对前面所举的序列而言,中值滤波的结果是用中值100替代序列80、120、90、200、100、110、70中的信号序列中心位置值200,得到的滤波序列就是80、120、90、100、100、110、70。如果在此序列中200是一个噪声信号,则用此方法即可去除这个噪声点。二维中值滤波算法是:对于一幅图像的象素矩阵,取以目标象素为中心的一个子矩阵窗口,这个窗口可以是3*3 ,5*5 等根据需要选取,对窗口内的象素灰度排序,取中间一个值作为目标象素的新灰度值。窗口示例如ooooxoooo上面x为目标象素,和周围o组成3*3矩阵Array,然后对这9个元素的灰度进行排序,以排序后的中间元素Array[4]为x的新灰度值,如此就完成对象素x的中值滤波,再迭代对其他需要的象素进行滤波即可。

图像处理中,中值滤波的实现方法

1:通过从图像中的某个采样窗口取出奇数个数据进行排序

2:用排序后的中值取代要处理的数据即可

中值滤波的算法实现过程,重点是排序,最常用的冒泡排序~~

把滤波区间的数据从小到大进行排序,然后取中值,(如果是奇数个数据,那么中值就只有一个了,如果偶数个数据,中值有两个,可以对两个数据再求平均)

下面是一个C语言实现中值滤波的函数:

unsigned char GetMedianNum(int * bArray, int iFilterLen)
{int i,j;// 循环变量unsigned char bTemp;// 用冒泡法对数组进行排序for (j = 0; j < iFilterLen - 1; j ++){for (i = 0; i < iFilterLen - j - 1; i ++){if (bArray[i] > bArray[i + 1]){// 互换bTemp = bArray[i];bArray[i] = bArray[i + 1];bArray[i + 1] = bTemp;}}}// 计算中值if ((iFilterLen & 1) > 0){// 数组有奇数个元素,返回中间一个元素bTemp = bArray[(iFilterLen + 1) / 2];}else{// 数组有偶数个元素,返回中间两个元素平均值bTemp = (bArray[iFilterLen / 2] + bArray[iFilterLen / 2 + 1]) / 2;}return bTemp;
}

注:bArray 是一个整形指针,我们传入的一般是一个数组,用来存储待排序的数据
iFilterLen 是滤波器的长度
用在图像处理中时,由于像素的取值范围是0~255,刚好是unsigned char 的范围,所以函数的返回值是unsigned char,如果我们要处理的数是float型,或其他类型,返回值也可以更改~~返回值是bTemp,也即是我们想得到的中值

下面是一个完整的C语言程序

/************************************************************************** 函数名称:*   MedianFilter()* 参数:*   int   iFilterH         - 滤波器的高度*   int   iFilterW         - 滤波器的宽度*   int   iFilterMX        - 滤波器的中心元素X坐标*   int   iFilterMY        - 滤波器的中心元素Y坐标* 说明:*   该函数对DIB图像进行中值滤波。************************************************************************/
#define iFilterW 1
#define iFilterH 1
#define iFilterMX 1
#define iFilterMY 1
#define WIDTHBYTES(bits)    (((bits) + 31) / 32 * 4)unsigned char GetMedianNum(int * bArray, int iFilterLen);
void MedianFilter(unsigned char *pImg1,unsigned char *pImg,int nWidth,int nHeight)
{       unsigned char   *lpSrc;                         // 指向源图像的指针 unsigned char   *lpDst;                         // 指向要复制区域的指针int         aValue[iFilterH*iFilterW];          // 指向滤波器数组的指针int         i,j,k,l;                            // 循环变量 int         lLineBytes;                         // 图像每行的字节数 lLineBytes = WIDTHBYTES(nWidth * 8);for ( i=0;i<nWidth;i++,pImg++ )(*pImg)=0;// 开始中值滤波// 行(除去边缘几行)for(i = iFilterMY; i < nHeight - iFilterH + iFilterMY + 1; i++){// 列(除去边缘几列)for(j = iFilterMX; j < nWidth - iFilterW + iFilterMX + 1; j++){// 指向新DIB第i行,第j个象素的指针lpDst = pImg + lLineBytes * (nHeight - 1 - i) + j;// 读取滤波器数组for (k = 0; k < iFilterH; k++){for (l = 0; l < iFilterW; l++){// 指向DIB第i - iFilterMY + k行,第j - iFilterMX + l个象素的指针lpSrc = pImg1 + lLineBytes * (nHeight - 1 - i + iFilterMY - k) + j - iFilterMX + l;// 保存象素值aValue[k * iFilterW + l] = *lpSrc;}}// 获取中值* lpDst = GetMedianNum(aValue, iFilterH * iFilterW);}}}unsigned char GetMedianNum(int * bArray, int iFilterLen)
{int     i,j;            // 循环变量unsigned char bTemp;// 用冒泡法对数组进行排序for (j = 0; j < iFilterLen - 1; j ++){for (i = 0; i < iFilterLen - j - 1; i ++){if (bArray[i] > bArray[i + 1]){// 互换bTemp = bArray[i];bArray[i] = bArray[i + 1];bArray[i + 1] = bTemp;}}}// 计算中值if ((iFilterLen & 1) > 0){// 数组有奇数个元素,返回中间一个元素bTemp = bArray[(iFilterLen + 1) / 2];}else{// 数组有偶数个元素,返回中间两个元素平均值bTemp = (bArray[iFilterLen / 2] + bArray[iFilterLen / 2 + 1]) / 2;}return bTemp;
}

关于中值滤波算法,以及C语言实现相关推荐

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

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

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

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

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

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

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

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

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

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

  6. c语言均值滤波步骤,关于中值滤波算法,以及C语言实现

    中值滤波是一种非线性的图像平滑方法,与均值滤波器以及其他线性滤波器相比,它能够很好地滤除脉冲噪声,同时又能够保护目标图像边缘.它是一种邻域运算, 类似于卷积,但计算的不是加权求和,而是把邻域中的像素按 ...

  7. verilog中值滤波算法实现及仿真

    使用verilog语言实现中值滤波算法,并编写testbench进行仿真,产生波形图. 可以使用vivado.ISE.quartusII等软件均可. 对代码.测试代码.仿真结果分别进行截图,如下所示: ...

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

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

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

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

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

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

最新文章

  1. android 高通平台有前途吗,华为鸿蒙计划要适配高通平台了,可以告别安卓搭载鸿蒙OS了?...
  2. win 64位系统安装带有c编写的python模块出现ValueError: [u'path']解决
  3. 合唱队形(递增再递减的最长子序列)
  4. python代码实现二叉树的镜像树
  5. Altium Designer原理图元件和PCB元件互相定位
  6. 树莓派:在ubuntu20-server安装和卸载桌面
  7. sqlserver中的查询两个结果集的差的运算
  8. boost::mp11::mp_is_set相关用法的测试程序
  9. VuePress 添加百度统计代码
  10. Cisco pix或asa如何防止内网用户乱改ip配置案例
  11. QQ号双主号要求验证码解决方法
  12. 防腐投加器需要加盐吗_风冷却器的正确防腐措施应该怎么做?
  13. Python的第三方库requests
  14. 电脑全能工具箱,400+工具免费用
  15. Windows64位 python3.6安装pyHook
  16. VS Code Python “Statements must be separated by newlines or semicolons“
  17. CentOS 7.4 YUM 搭建LANP环境+WordPress
  18. Three.js三角形Triangle
  19. android 遥控器配置文件,[转载]android万能遥控器之一--前言及发射部分的简单实现...
  20. 最新版Shiro-SpringBoot项目实战笔记

热门文章

  1. 服装计算机辅助设计论文,计算机辅助高校服装设计论文
  2. Android 用代码Ping网络
  3. 手眼标定,我的结果显示手和眼相距上千米!手眼标定结果准确率如何提高?
  4. C语言题目:三天打鱼,两天晒网,判断输入日期是在打鱼还是晒网
  5. vdbench 参数详解
  6. 网吧操作系统制作与优化
  7. grubbs准则 matlab_MATLAB-格拉布斯准则(MATLAB-Grubbs-criterion)-M
  8. 概率图模型之贝叶斯网络的理解与应用
  9. 贝叶斯网络是神经网络吗,贝叶斯网络和神经网络
  10. c语言ascii码表查询,ascii码表查询_ascii码表怎么看