均值濾波
均值濾波是典型的線性濾波算法,它是指在圖像上對(duì)目標(biāo)像素給一個(gè)模板,該模板包括了其周圍的臨近像素(以目標(biāo)像素為中心的周圍個(gè)像素,構(gòu)成一個(gè)濾波模板,即去掉目標(biāo)像素本身),再用模板中的全體像素的平均值來代替原來像素值。
均值濾波也稱為線性濾波,其采用的主要方法為鄰域平均法。線性濾波的基本原理是用均值代替原圖像中的各個(gè)像素值,即對(duì)待處理的當(dāng)前像素點(diǎn)(x,y),選擇一個(gè)模板,該模板由其近鄰的若干像素組成,求模板中所有像素的均值,再把該均值賦予當(dāng)前像素點(diǎn)(x,y),作為處理后圖像在該點(diǎn)上的灰度g(x,y),即g(x,y)=/m ∑f(x,y) m為該模板中包含當(dāng)前像素在內(nèi)的像素總個(gè)數(shù)。
均值濾波介紹
濾波是濾波是將信號(hào)中特定波段頻率濾除的操作,是從含有干擾的接收信號(hào)中提取有用信號(hào)的一種技術(shù)。
均值濾波是典型的線性濾波算法,它是指在圖像上對(duì)目標(biāo)像素給一個(gè)模板,該模板包括了其周圍的臨近像素(如×模板:以目標(biāo)象素為中心的周圍個(gè)象素,構(gòu)成一個(gè)濾波模板,即去掉目標(biāo)象素本身),再用模板中的全體像素的平均值來代替原來像素值。
均值濾波效果:平滑線性濾波處理降低了圖像的“尖銳”變化。由于典型的隨機(jī)噪聲由灰度級(jí)的急劇變化組成,因此常見的平滑處理的應(yīng)用就是降低噪聲。均值濾波器的主要應(yīng)用是去除圖像中的不相關(guān)細(xì)節(jié),其中“不相關(guān)”是指與濾波器模板尺寸相比較小的像素區(qū)域。然而,由于圖像的邊緣也是由圖像灰度的尖銳變化帶來的特性,所以均值濾波處理還是存在著邊緣模糊的負(fù)面效應(yīng)。
均值濾波算法實(shí)現(xiàn)(C語(yǔ)言)
// junzhilvbo.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。
//
#include “stdafx.h”
#include “stdlib.h”
#include “string.h”
#define DATA_X //數(shù)字圖像水平像素個(gè)數(shù)
#define DATA_Y //數(shù)字圖像豎直像素個(gè)數(shù)
void OpenFile(const char *cFilePath , int nOriginalData[DATA_Y][DATA_X])
{
printf(“正在獲取數(shù)據(jù)。。。。。。 ”);
FILE *fp ;
fp = fopen(cFilePath , “r”);
if(NULL == fp)
{
printf(“open file failed! ”);
return ;
}
unsigned char *pData = (unsigned char *)malloc(sizeof(unsigned char)*DATA_X*DATA_Y);
if(NULL == pData)
{
printf(“memory malloc failed! ”);
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(“正在保存數(shù)據(jù)。。。。。。 ”);
int count_x,count_y;
FILE *fp ;
fp = fopen(cFilePath , “w”);
if(NULL == fp)
{
printf(“open file failed! ”);
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(“文件保存成功! ”);
return ;
}
bool JunZhiLvBo(const int nOriginalData[DATA_Y][DATA_X], int nResultData[DATA_Y][DATA_X])
{
printf(“正在進(jìn)行均值濾波。。。。。。 ”);
int count_x ,count_y ;
/**模版濾波計(jì)算,不計(jì)算邊緣像素*/
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+])/);
}
}
/*對(duì)四個(gè)邊緣直接進(jìn)行賦值處理*/
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)); //初始化數(shù)組
memset(nResultData,,sizeof(nResultData));
char cOpenFilePath[] = “Lena.raw”; //圖像文件路徑
OpenFile(cOpenFilePath,nOriginalData);
if(!JunZhiLvBo(nOriginalData,nResultData)) //濾波計(jì)算
{
printf(“操作失?。?”);
return ;
}
char cSaveFilePath[] = “Result.raw”; //文件保存路徑
SaveFile(cSaveFilePath,nResultData);
return ;
}
均值濾波算法效果對(duì)比
均值濾波之前: 均值濾波之后:
評(píng)論