中值滤波原理及c语言的实现,关于中值滤波算法,以及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, 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语言实现(转)相关推荐
- 二叉树计算叶子节点c语言报告,二叉树计算叶子节点的算法(数据结构)C语言版...
<二叉树计算叶子节点的算法(数据结构)C语言版>由会员分享,可在线阅读,更多相关<二叉树计算叶子节点的算法(数据结构)C语言版(1页珍藏版)>请在人人文库网上搜索. 1.* H ...
- uniapp对象怎么获取值_原理 | 怎么获取PMSM电机转子位置Offset值
更多,更及时的干货内容,请加我们的微信公众号:wc_dj8 诚邀业内人士及机构向我们投稿,投稿有礼 投稿邮箱:tougao@51wctt.com 来源| 网络 问题: PMSM电机,如果电机铭牌上的o ...
- crc16 ibm c语言,CRC16常见几个标准的算法及C语言实现
CRC码由发送端计算,放置于发送信息报文的尾部.接收信息的设备再重新计算接收到信息报文的CRC,比较计算得到的CRC是否与接收到的相符,如果两者不相符,则表明出错. 校验码的计算多项式为(X16 + ...
- c语言为正数无限大,无限大整数相加算法的C语言源代码
#include #include#include#include #define MAXNUM 1000000000000000000 /*存储数据用的结构 long int型指针(Number)指 ...
- 详解非局部均值滤波原理以及用MATLAB源码实现
详解非局部均值滤波原理以及用MATLAB源码实现 序言 均值滤波.中值滤波.高斯滤波在滤除噪声的过程中,无可避免的使图像的边缘细节和纹理信息所被滤除.针对此问题,Buades[1]等人提出了非局部均值 ...
- FreeRtos学习笔记(11)查找就绪任务中优先级最高任务原理刨析
FreeRtos学习笔记(11)查找就绪任务中优先级最高任务原理刨析 怎么查找就绪任务中优先级最高的? tasks.c中声明了一个全局变量 uxTopReadyPriority,任务从其他状态进入就绪 ...
- OpenCV中文文档4.0.0学习笔记(更新中……)
系列文章目录 文章目录 系列文章目录 前言 一.简介 1.OpenCV-Python教程简介 2.OpenCV-Python 3.OpenCV-Python教程 4.OpenCV 需要你!!! 二.G ...
- crc校验算法程序c语言实现,CRC校验的快速算法的C语言实现
CRC校验的快速算法的C语言实现 CC R校验的快速算法的C语言实现 颜国谷 (中原油田信息中心 4 70 ) 5 0 1 摘要:c c R循环冗余校验算法,是一种在数据存储和数据通讯领域中使用十分广 ...
- python思想读后感_数据结构与算法:Python语言描述读后感1000字
<数据结构与算法:Python语言描述>是一本由裘宗燕著作,机械工业出版社出版的平装图书,本书定价:CNY 45.00,页数:343,特精心从网络上整理的一些读者的读后感,希望对大家能有帮 ...
- 常见排序算法(C语言实现)
常见排序算法(C语言实现) 文章目录 常见排序算法(C语言实现) 一.插入排序 二.希尔排序 三.选择排序 四.堆排序 五.冒泡排序 六.快速排序 七.归并排序 一.插入排序 void insertS ...
最新文章
- SAP WM LQ02 为供应商寄售库存去K的时候,如果有Open TO单,则不能成功为物料去K?
- 记录一下HALCON检测螺钉是否存在
- 【机器学习基础】浅谈为什么L2正则化有效
- ARM 之七 主流编译器(armcc、iar、gcc for arm、LLVM(clang))详细介绍
- [转载红鱼儿]kbmmw 开发点滴:Authorization failed.
- 批量杀死MySQL连接的几种方法
- centos mysql 升级 5.7_CentOS 7下升级MySQL5.7.23的一个坑
- [原创]Nexus5 内核编译烧录过程记录
- 从头搭建drbd+openfiler+corosync (二)
- android recovery 3e,【记录】尝试用ODIN去恢复启动界面是Android system recovery 3e的I9100G...
- 【CTFhub】彩蛋篇_持续更新
- 【颜纠日记】利用PS在原创图片上制作十字水印
- 在VS Code中开启gdb的pretty-printer功能
- android rom 刷数据吗,安卓手机如何刷入rom包 安卓机刷入rom包方法
- CSDN校园活动社开展“开学季活动”
- springboot启动错误 Could not resolve placeholder
- 响应服务器554,服务器554
- GD32F4(5):GD32F450时钟配置为200M过程分析
- 无法打开文件“libboost_thread-vc120-mt-gd-1_58.lib
- 数据仓库与数据挖掘(全英文)期末复习
热门文章
- JSON转Excel
- 服装CAD软件测试初学者,CAD服装打版基础教程
- 快递100支持的物流公司
- linux卸载apache服务器,centos 7 安装卸载apache(httpd)服务的详细步骤
- usb驱动修复_win10 1903 5月29号的质量更新修复了哪些问题?
- iOS RSA加签 验签 与Java同步 pkcs8 pkcs1
- 远程计算机超出最大连接数,远程桌面超出了最大连接数怎么办呢?
- 《信号与系统》4.11.2系统函数的幅频特性和相频特性分析 MATLAB实现
- win7连接共享打印机时安装驱动程序出现0x00000bcb错误【解决办法】
- java楼盘管理系统_javaweb房产信息管理系统