1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > c语言均值滤波程序 均值滤波和均值滤波算法程序

c语言均值滤波程序 均值滤波和均值滤波算法程序

时间:2021-01-08 18:49:22

相关推荐

c语言均值滤波程序 均值滤波和均值滤波算法程序

描述

均值滤波

均值滤波是典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素(以目标像素为中心的周围个像素,构成一个滤波模板,即去掉目标像素本身),再用模板中的全体像素的平均值来代替原来像素值。

均值滤波也称为线性滤波,其采用的主要方法为邻域平均法。线性滤波的基本原理是用均值代替原图像中的各个像素值,即对待处理的当前像素点(x,y),选择一个模板,该模板由其近邻的若干像素组成,求模板中所有像素的均值,再把该均值赋予当前像素点(x,y),作为处理后图像在该点上的灰度g(x,y),即g(x,y)=/m ∑f(x,y) m为该模板中包含当前像素在内的像素总个数。

均值滤波介绍

滤波是滤波是将信号中特定波段频率滤除的操作,是从含有干扰的接收信号中提取有用信号的一种技术。

均值滤波是典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素(如×模板:以目标象素为中心的周围个象素,构成一个滤波模板,即去掉目标象素本身),再用模板中的全体像素的平均值来代替原来像素值。

均值滤波效果:平滑线性滤波处理降低了图像的“尖锐”变化。由于典型的随机噪声由灰度级的急剧变化组成,因此常见的平滑处理的应用就是降低噪声。均值滤波器的主要应用是去除图像中的不相关细节,其中“不相关”是指与滤波器模板尺寸相比较小的像素区域。然而,由于图像的边缘也是由图像灰度的尖锐变化带来的特性,所以均值滤波处理还是存在着边缘模糊的负面效应。

均值滤波算法实现(C语言)

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

//

#include “stdafx.h”

#include “stdlib.h”

#include “string.h”

#define DATA_X //数字图像水平像素个数

#define DATA_Y //数字图像竖直像素个数

void OpenFile(const char *cFilePath , int nOriginalData[DATA_Y][DATA_X])

{

printf(“正在获取数据。。。。。。\n”);

FILE *fp ;

fp = fopen(cFilePath , “r”);

if(NULL == fp)

{

printf(“open file failed! \n”);

return ;

}

unsigned char *pData = (unsigned char *)malloc(sizeof(unsigned char)*DATA_X*DATA_Y);

if(NULL == pData)

{

printf(“memory malloc failed!\n”);

return ;

}

fread(pData , sizeof(unsigned char)*DATA_X*DATA_Y , , fp);

int count_x = ;

int count_y = ;

for(;count_y 《 DATA_Y ; count_y++)

{

for(; count_x 《 DATA_X ;count_x++)

{

nOriginalData[count_y][count_x] = pData[count_y*DATA_Y+count_x];

}

}

free(pData);

fclose(fp);

return ;

}

void SaveFile(const char *cFilePath , int nResultData[DATA_Y][DATA_X])

{

printf(“正在保存数据。。。。。。\n”);

int count_x,count_y;

FILE *fp ;

fp = fopen(cFilePath , “w”);

if(NULL == fp)

{

printf(“open file failed! \n”);

return ;

}

for(count_y=;count_y《DATA_Y;count_y++)

{

for(count_x=;count_x《DATA_X;count_x++)

{

fwrite(&nResultData[count_y][count_x],,,fp);

}

}

fclose(fp);

printf(“文件保存成功! \n”);

return ;

}

bool JunZhiLvBo(const int nOriginalData[DATA_Y][DATA_X], int nResultData[DATA_Y][DATA_X])

{

printf(“正在进行均值滤波。。。。。。\n”);

int count_x ,count_y ;

/**模版滤波计算,不计算边缘像素*/

for(count_y = ; count_y 《 DATA_Y ; count_y++)

{

for(count_x = ; count_x 《 DATA_X ;count_x++)

{

nResultData[count_y][count_x] = (int)((nOriginalData[count_y-][count_x-]+

nOriginalData[count_y-][count_x] +

nOriginalData[count_y-][count_x+]+

nOriginalData[count_y][count_x-] +

nOriginalData[count_y][count_x] +

nOriginalData[count_y][count_x+] +

nOriginalData[count_y+][count_x-]+

nOriginalData[count_y+][count_x] +

nOriginalData[count_y+][count_x+])/);

}

}

/*对四个边缘直接进行赋值处理*/

for(count_x=;count_x《DATA_X;count_x++) //水平边缘像素等于原来像素灰度值

{

nResultData[][count_x]=nOriginalData[][count_x];

nResultData[DATA_Y-][count_x]=nOriginalData[DATA_Y-][count_x];

}

for(count_y=;count_y《DATA_Y-;count_y++) //竖直边缘像素等于原来像素灰度值

{

nResultData[count_y][]=nOriginalData[count_y][];

nResultData[count_y][DATA_X-]=nOriginalData[count_y][DATA_X-];

}

return true ;

}

int _tmain(int argc, _TCHAR* argv[])

{

int nOriginalData[DATA_Y][DATA_X]; //保存原始图像灰度值

int nResultData[DATA_Y][DATA_X]; //保存滤波后的灰度值

memset(nOriginalData,,sizeof(nOriginalData)); //初始化数组

memset(nResultData,,sizeof(nResultData));

char cOpenFilePath[] = “Lena.raw”; //图像文件路径

OpenFile(cOpenFilePath,nOriginalData);

if(!JunZhiLvBo(nOriginalData,nResultData)) //滤波计算

{

printf(“操作失败!\n”);

return ;

}

char cSaveFilePath[] = “Result.raw”; //文件保存路径

SaveFile(cSaveFilePath,nResultData);

return ;

}

均值滤波算法效果对比

均值滤波之前: 均值滤波之后:

打开APP精彩内容

点击阅读全文

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。