源:关于中值滤波算法,以及C语言实现

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 = ; j < iFilterLen - ; j ++)
{
for (i = ; i < iFilterLen - j - ; i ++)
{
if (bArray[i] > bArray[i + ])
{
// 互换
bTemp = bArray[i];
bArray[i] = bArray[i + ];
bArray[i + ] = bTemp;
}
}
} // 计算中值
if ((iFilterLen & ) > )
{
// 数组有奇数个元素,返回中间一个元素
bTemp = bArray[(iFilterLen + ) / ];
}
else
{
// 数组有偶数个元素,返回中间两个元素平均值
bTemp = (bArray[iFilterLen / ] + bArray[iFilterLen / + ]) / ;
} return bTemp;
}
注:bArray 是一个整形指针,我们传入的一般是一个数组,用来存储待排序的数据
&nbsp; &nbsp; iFilterLen 是滤波器的长度
&nbsp; &nbsp;用在图像处理中时,由于像素的取值范围是0~,刚好是unsigned char 的范围,所以函数的返回值是unsigned char,如果我们要处理的数是float型,或其他类型,返回值也可以更改~~返回值是bTemp,也即是我们想得到的中值
<span style="color: rgb(51, 51, 51);">下面是一个完整的C语言程序,用在图像处理中</span>
/*************************************************************************
* 函数名称:
* 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 * );
for ( i=;i<nWidth;i++,pImg++ )
(*pImg)=;
// 开始中值滤波
// 行(除去边缘几行)
for(i = iFilterMY; i < nHeight - iFilterH + iFilterMY + ; i++)
{
// 列(除去边缘几列)
for(j = iFilterMX; j < nWidth - iFilterW + iFilterMX + ; j++)
{
// 指向新DIB第i行,第j个象素的指针
lpDst = pImg + lLineBytes * (nHeight - - i) + j; // 读取滤波器数组
for (k = ; k < iFilterH; k++)
{
for (l = ; l < iFilterW; l++)
{
// 指向DIB第i - iFilterMY + k行,第j - iFilterMX + l个象素的指针
lpSrc = pImg1 + lLineBytes * (nHeight - - 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 = ; j < iFilterLen - ; j ++)
{
for (i = ; i < iFilterLen - j - ; i ++)
{
if (bArray[i] > bArray[i + ])
{
// 互换
bTemp = bArray[i];
bArray[i] = bArray[i + ];
bArray[i + ] = bTemp;
}
}
} // 计算中值
if ((iFilterLen & ) > )
{
// 数组有奇数个元素,返回中间一个元素
bTemp = bArray[(iFilterLen + ) / ];
}
else
{
// 数组有偶数个元素,返回中间两个元素平均值
bTemp = (bArray[iFilterLen / ] + bArray[iFilterLen / + ]) / ;
} return bTemp;
}

关于中值滤波算法,以及C语言实现(转)的更多相关文章

  1. 基于FPGA的中值滤波算法实现

    在这一篇开篇之前,我需要解决一个问题,上一篇我们实现了基于FPGA的均值滤波算法的实现,最后的显示效果图上发现有一些黑白色的斑点,我以为是椒盐噪声,然后在做基于FPGA的中值滤波算法的实验时,我发现黑 ...

  2. 基于MATLAB的中值滤波算法实现

    在实时图像采集中,不可避免的会引入噪声,尤其是干扰噪声和椒盐噪声,噪声的存在严重影响边缘检测的效果,中值滤波是一种基于排序统计理论的非线性平滑计数,能有效平滑噪声,且能有效保护图像的边缘信息,所以被广 ...

  3. 3D Slicer中文教程(七)—图像中值滤波

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

  4. PIE SDK中值滤波

    1.算法功能简介 中值滤波是一种最常用的非线性平滑滤波器,它将窗口内的所有像素值按高低排序后,取中间值作为中心像素的新值. 中值滤波对噪声有良好的滤除作用,特别是在滤除噪声的同时,能够保护信号的边缘, ...

  5. 基于Opencv的自适应中值滤波函数selfAdaptiveMedianBlur()

    7.3.3 自适应滤波器 自适应中值滤波器 对于7.3.2节所讨论的中值滤波器,只要脉冲噪声的空间密度不大,性能还是可以的(根据经验需Pa和Pb小于0.2).本节将证明,自适应中值滤波器可以处理更大概 ...

  6. opencv-11-中值滤波及自适应中值滤波

    开始之前 在上一篇我们实现了读取噪声图像, 然后 进行三种形式的均值滤波得到结果, 由于我们自己写的均值滤波未作边缘处理, 所以效果有一定的下降, 但是总体来说, 我们得到的结果能够说明我们的算法执行 ...

  7. 中值滤波C语言优化

    中值滤波C语言优化 图像平滑是图像预处理的基本操作,本文首先用不同的方法对一张图片做预处理比较它们效果的不同,然后针对中值滤波,实现了一种快速实现.(其实是copy的opencv实现,呵呵).因为op ...

  8. 基于记忆性的中值滤波O(r)与O(1)复杂度的算法实现

    本文参考博客:https://www.cnblogs.com/Imageshop/archive/2013/04/26/3045672.html 原生的中值滤波是基于排序算法的,这样的算法复杂度基本在 ...

  9. Atitit   图像处理 平滑 也称 模糊, 归一化块滤波、高斯滤波、中值滤波、双边滤波)

    Atitit   图像处理 平滑 也称 模糊, 归一化块滤波.高斯滤波.中值滤波.双边滤波) 是一项简单且使用频率很高的图像处理方法 用途 去噪 去雾 各种线性滤波器对图像进行平滑处理,相关OpenC ...

随机推荐

  1. AI 人工智能 探索 (七)

    我简单画了一幅图,来讲下 ai 中的设计模式.图形中的这些人物,我想大家都能看的明白. 当 盗贼出现,人们发现了他们,就 呼叫 主类,然后主类再  通知 下面对应的管理局,然后管理局再 分配人手过去 ...

  2. UVA - 437 The Tower of Babylon(dp-最长递增子序列)

    每一个长方形都有六种放置形态,其实可以是三种,但是判断有点麻烦直接用六种了,然后按照底面积给这些形态排序,排序后就完全变成了LIS的问题.代码如下: #include<iostream> ...

  3. [原]界面上有几个球队名字的列表,将鼠标放到球队名字上就变为红色背景,其他球队背景颜色为白色,点击一个球队的时候就将点击的球队变为fontSize=30字体(fontSize=‘’回到默认)。

    window.onload = function () {             var uls = document.getElementById('ui').getElementsByTagNa ...

  4. [IDL入门] 两个PPT,IDL上手

    首先看看IDL能干什么,<Solving Real Problems with Computer Graphics>ppt是英文的,很精彩. 下载地址:http://pan.baidu.c ...

  5. CodeForces 412D Giving Awards

    根据给出的条件建边,然后进行dfs 对于某个点x,当x的后继都遍历完毕后,再输出x节点. 这样能保证所有约束条件. #include<cstdio> #include<cstring ...

  6. java开发第一天

    今天是项目开始的时间,整体来说还是算顺利的.提前分好组,然后是听课时可以有人帮忙占座位的,感觉上是挺好的. 项目开发的难度看了看,由于有了第一次MFC开发的经验,所以这次听课感觉非常的有目标性,而且总 ...

  7. linq to sql DAL

    using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Data. ...

  8. Zabbix之配置文件详解

    zabbix的配置文件一般有三种:zabbixserver的配置文件zabbix_server.confzabbixproxy的配置文件zabbix_proxy.confzabbix_agentd的配 ...

  9. oracle中的赋权

    1 怎么给用户赋权限 grant create view to scott; (create view 是权限的名称) 2 怎么给用户撤销权限 revoke create view from scot ...

  10. msf常用命令

    msf > search -r great -t exploits search命令查找rank为great的exploit msf > setg RHOST 192.168.1.102 ...