首页
学习
活动
专区
工具
TVP
发布

图像处理之中值滤波介绍及C实现

1、中值滤波概述

中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号平滑处理技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值。

中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点。方法是用某种结构的二维滑动模板,将板内像素按照像素值的大小进行排序,生成单调上升(或下降)的为二维数据序列。二维中值滤波输出为g(x,y)=med ,其中,f(x,y),g(x,y)分别为原始图像和处理后图像。W为二维模板,通常为3*3,5*5区域,也可以是不同的的形状,如线状,圆形,十字形,圆环形等。

2、中值滤波算法原理

中值滤波数学实现:对一个数字信号序列xj(-∞

在实际应用中,随着所选用窗口长度的增加,滤波的计算量将会迅速增加。因此,寻求中值滤波的快速算法,是中值滤波理论的一个重要研究内容。

中值滤波的快速算法,一般采用下述三种方式:

①直方图数据修正法;

②样本值二进制表示逻辑判断法;

③数字和模拟的选择网络法。

对中值滤波的理论研究,还集中于统计特性分析和根序列的描述方面。当一个信号序列经一特定窗口长度的中值滤波反复处理后,它会收敛于某一个不再变化的序列,这个序列称为中值滤波的根序列。根序列是描述中值滤波特性的一个重要概念。通过对根序列结构的研究,可以确定原信号序列中,哪些成分可以经中值滤波后保留下来,哪些成分将被抑制。这对确定中值滤波器的窗口长度,提供了重要依据。用VLSI实现的中值滤波器芯片,可供实时处理中应用。

3、中值滤波算法流程

4、中值滤波应用及优势

中值滤波法对消除椒盐噪声非常有效,在光学测量条纹图象的相位分析处理方法中有特殊作用,但在条纹中心分析方法中作用不大.

中值滤波在图像处理中,常用于保护边缘信息,是经典的平滑噪声的方法。

5、中值滤波代码实现

// zhongzhilvbo.cpp : 定义控制台应用程序的入口点。

//

#include

#include

#include

#include

#include

#include

#include "stdafx.h"

//原图象的宽度和高度

#define width 352

#define higth 288

int lvbo(unsigned char D[9])

{

unsigned int temp;

int i,j;

for(i=0;i

{

for(j=0;j

{

if(D[i]>D[j+1])

{

temp=D[i];

D[i]=D[j+1];

D[j+1]=temp;

}

}

}

return D[4];

}

void main()

{

FILE *fp,*newfp;

int i,j;

if(!(fp=fopen("fmh1.bmp","rb")))

{

printf("Open file %s error!\n","k.bmp");

return ;

}

if(!(newfp=fopen("fmout.bmp","wb")))

{

printf("Open file %s error!\n","result.bmp");

return ;

}

unsigned char buffer[54+1024];//定义原图像头缓冲区

fread(buffer,1,54+1024,fp);//读取文件头54个字节

unsigned long length=width*higth;//图像的总象素个数

unsigned char readData[higth][width]; //用于存储原图数据的数组

unsigned char writeData[higth][width]; //用于存储原图数据的数组

fread(&readData[0][0], sizeof(unsigned char),length, fp);//从原图读入数据

for(i=0;i

{

for(j=0;j

{

writeData[i][j]=readData[i][j];

}

}

unsigned char D[9]; //定义选取框

for(i=1;i

{

for(j=1;j

{

D[0]=readData[i-1][j+1];

D[1]=readData[i][j+1];

D[2]=readData[i+1][j+1];

D[3]=readData[i-1][j];

D[4]=readData[i][j];

D[5]=readData[i+1][j];

D[6]=readData[i-1][j-1];

D[7]=readData[i][j-1];

D[8]=readData[i+1][j-1];

writeData[i][j]=lvbo(D);

}

}

fwrite(buffer,sizeof(unsigned char),54+1024,newfp);

fwrite(writeData,sizeof(unsigned char),length,newfp);

fclose(newfp);

fclose(fp);

return ;

}

经过中值滤波处理后的对比图片:

来源:(淇淇宝贝)http://www.cnblogs.com/qiqibaby/p/5281743.html

权威发布有关Imagination公司GPU、人工智能以及连接IP、无线IP最新资讯,提供有关物联网、可穿戴、通信、汽车电子、医疗电子等应用信息,每日更新大量信息,让你紧跟技术发展,欢迎关注!伸出小手按一下二维码我们就是好朋友!

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180710B0706400?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券