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, intiFilterLen)

{int i,j;//循环变量

unsigned charbTemp;//用冒泡法对数组进行排序

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;

}returnbTemp;

}

注: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)unsignedchar GetMedianNum(int * bArray, intiFilterLen);void MedianFilter(unsigned char *pImg1,unsigned char *pImg,int nWidth,intnHeight)

{

unsignedchar *lpSrc; //指向源图像的指针

unsigned char *lpDst; //指向要复制区域的指针

int aValue[iFilterH*iFilterW]; //指向滤波器数组的指针

int i,j,k,l; //循环变量

int lLineBytes; //图像每行的字节数

lLineBytes = WIDTHBYTES(nWidth * 8);for ( i=0;i

(*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);

}

}

}

unsignedchar GetMedianNum(int * bArray, intiFilterLen)

{int i,j; //循环变量

unsigned charbTemp;//用冒泡法对数组进行排序

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;

}returnbTemp;

}

中值滤波原理及c语言的实现,关于中值滤波算法,以及C语言实现(转)相关推荐

  1. 二叉树计算叶子节点c语言报告,二叉树计算叶子节点的算法(数据结构)C语言版...

    <二叉树计算叶子节点的算法(数据结构)C语言版>由会员分享,可在线阅读,更多相关<二叉树计算叶子节点的算法(数据结构)C语言版(1页珍藏版)>请在人人文库网上搜索. 1.* H ...

  2. uniapp对象怎么获取值_原理 | 怎么获取PMSM电机转子位置Offset值

    更多,更及时的干货内容,请加我们的微信公众号:wc_dj8 诚邀业内人士及机构向我们投稿,投稿有礼 投稿邮箱:tougao@51wctt.com 来源| 网络 问题: PMSM电机,如果电机铭牌上的o ...

  3. crc16 ibm c语言,CRC16常见几个标准的算法及C语言实现

    CRC码由发送端计算,放置于发送信息报文的尾部.接收信息的设备再重新计算接收到信息报文的CRC,比较计算得到的CRC是否与接收到的相符,如果两者不相符,则表明出错. 校验码的计算多项式为(X16 + ...

  4. c语言为正数无限大,无限大整数相加算法的C语言源代码

    #include #include#include#include #define MAXNUM 1000000000000000000 /*存储数据用的结构 long int型指针(Number)指 ...

  5. 详解非局部均值滤波原理以及用MATLAB源码实现

    详解非局部均值滤波原理以及用MATLAB源码实现 序言 均值滤波.中值滤波.高斯滤波在滤除噪声的过程中,无可避免的使图像的边缘细节和纹理信息所被滤除.针对此问题,Buades[1]等人提出了非局部均值 ...

  6. FreeRtos学习笔记(11)查找就绪任务中优先级最高任务原理刨析

    FreeRtos学习笔记(11)查找就绪任务中优先级最高任务原理刨析 怎么查找就绪任务中优先级最高的? tasks.c中声明了一个全局变量 uxTopReadyPriority,任务从其他状态进入就绪 ...

  7. OpenCV中文文档4.0.0学习笔记(更新中……)

    系列文章目录 文章目录 系列文章目录 前言 一.简介 1.OpenCV-Python教程简介 2.OpenCV-Python 3.OpenCV-Python教程 4.OpenCV 需要你!!! 二.G ...

  8. crc校验算法程序c语言实现,CRC校验的快速算法的C语言实现

    CRC校验的快速算法的C语言实现 CC R校验的快速算法的C语言实现 颜国谷 (中原油田信息中心 4 70 ) 5 0 1 摘要:c c R循环冗余校验算法,是一种在数据存储和数据通讯领域中使用十分广 ...

  9. python思想读后感_数据结构与算法:Python语言描述读后感1000字

    <数据结构与算法:Python语言描述>是一本由裘宗燕著作,机械工业出版社出版的平装图书,本书定价:CNY 45.00,页数:343,特精心从网络上整理的一些读者的读后感,希望对大家能有帮 ...

  10. 常见排序算法(C语言实现)

    常见排序算法(C语言实现) 文章目录 常见排序算法(C语言实现) 一.插入排序 二.希尔排序 三.选择排序 四.堆排序 五.冒泡排序 六.快速排序 七.归并排序 一.插入排序 void insertS ...

最新文章

  1. SAP WM LQ02 为供应商寄售库存去K的时候,如果有Open TO单,则不能成功为物料去K?
  2. 记录一下HALCON检测螺钉是否存在
  3. 【机器学习基础】浅谈为什么L2正则化有效
  4. ARM 之七 主流编译器(armcc、iar、gcc for arm、LLVM(clang))详细介绍
  5. [转载红鱼儿]kbmmw 开发点滴:Authorization failed.
  6. 批量杀死MySQL连接的几种方法
  7. centos mysql 升级 5.7_CentOS 7下升级MySQL5.7.23的一个坑
  8. [原创]Nexus5 内核编译烧录过程记录
  9. 从头搭建drbd+openfiler+corosync (二)
  10. android recovery 3e,【记录】尝试用ODIN去恢复启动界面是Android system recovery 3e的I9100G...
  11. 【CTFhub】彩蛋篇_持续更新
  12. 【颜纠日记】利用PS在原创图片上制作十字水印
  13. 在VS Code中开启gdb的pretty-printer功能
  14. android rom 刷数据吗,安卓手机如何刷入rom包 安卓机刷入rom包方法
  15. CSDN校园活动社开展“开学季活动”
  16. springboot启动错误 Could not resolve placeholder
  17. 响应服务器554,服务器554
  18. GD32F4(5):GD32F450时钟配置为200M过程分析
  19. 无法打开文件“libboost_thread-vc120-mt-gd-1_58.lib
  20. 数据仓库与数据挖掘(全英文)期末复习

热门文章

  1. JSON转Excel
  2. 服装CAD软件测试初学者,CAD服装打版基础教程
  3. 快递100支持的物流公司
  4. linux卸载apache服务器,centos 7 安装卸载apache(httpd)服务的详细步骤
  5. usb驱动修复_win10 1903 5月29号的质量更新修复了哪些问题?
  6. iOS RSA加签 验签 与Java同步 pkcs8 pkcs1
  7. 远程计算机超出最大连接数,远程桌面超出了最大连接数怎么办呢?
  8. 《信号与系统》4.11.2系统函数的幅频特性和相频特性分析 MATLAB实现
  9. win7连接共享打印机时安装驱动程序出现0x00000bcb错误【解决办法】
  10. java楼盘管理系统_javaweb房产信息管理系统