69,382
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
///////////////宏定义和全局变量定义///////////////
#define width 256 //定义输入图像的宽
#define height 256 //定义输入图像的高
unsigned char image[height][width]; //源灰度图像存储数组
unsigned char Mimage[height][width]; //滤波图像存储数组
int a; //用于存储main()函数中获取的用户输入
unsigned char *bmp_head;
///////////////函数声明部分//////////////////////
void maopao(int sz[],int Length);
bool zzlb(char *fileName,char *zzlbfileName);
///////////////主函数///////////////////////
void main()
{
printf("请选择您希望使用的中值窗进行中值滤波,如使用3*3中值窗请键入3,如使用5*5中值窗请键入5,如使用7*7中值窗请键入7,然后按回车键:");
scanf("%d",&a);
char *fileName,*zzlbfileName;
fileName = "lena.bmp"; //源图像路径、名称
zzlbfileName = "zzlb_lena.bmp"; //中值滤波后的图像路径、名称
zzlb(fileName,zzlbfileName); //调用中值滤波函数
}
//////////////灰度图像中值滤波函数///////////////////
bool zzlb(char *fileName,char *zzlbfileName)
{
FILE *imageFile; //图像的文件指针
int i,j; //循环: i行计数,j列计数
int k; //循环: k用于一维数组lssz[k]
int l,m; //循环,读入模板覆盖的源图像的像素值到lssz[]中时,l行计数,m列计数
int mbwidth; //模板的宽度
int mbheight; //模板的高度
int mbzxX; //模板中心的X坐标(相对于模板)
int mbzxY; //模板中心的Y坐标(相对于模板)
int mbSize; //模板长度,定义一维数组长度使用,也将此数据传递于maopao(int sz[],int Length)函数中的Length
int lssz[49]; //用于存放滤波模板覆盖的源图像的像素值
if(a==3)
{
mbwidth=3;
mbheight=3;
mbzxX=1;
mbzxY=1;
}
else
if(a==5)
{
mbwidth=5;
mbheight=5;
mbzxX=2;
mbzxY=2;
}
else
if(a==7)
{
mbwidth=7;
mbheight=7;
mbzxX=3;
mbzxY=3;
}
else
{
printf("您没有选择正确的中值窗,请按任意键退出程序,重新运行。\n");
return false;
}
mbSize=mbwidth*mbheight;
//////////////读取源bmp图像文件到image数组//////////////
//打开文件
if((imageFile=fopen(fileName,"rb"))==NULL) //指向原始文件
{
printf("%s 文件打开错误!请按任意键退出。\n",fileName);
return false; //失败返回
}
bmp_head=(unsigned char*)malloc(1078);
fread(bmp_head,1,1078,imageFile);
///////////////将滤波数组写入目标文件/////////////////
FILE *zzlbFile; //中值滤波后图像的文件指针
//创建文件
if((zzlbFile=fopen(zzlbfileName,"wb"))==NULL) //指向中值滤波后的图像
{
printf("%s 文件创建错误!请按任意键退出。\n",zzlbfileName);
return false; //失败返回
}
//读文件
for(i=0;i<height;i++)
fread(image[i],sizeof(unsigned char),width,imageFile);
//关闭文件
fclose(imageFile);
//////////////////进行中值滤波处理//////////////////
/////用原始图像数据初始化滤波图像数组Mimage////////
for(i=0;i<height;i++)
{
for(j=0;j<width;j++)
{
Mimage[i][j]=image[i][j];
}
}
//用模板中值填充模板中心点
// 进行模板计算,行(除去边缘几行)
for(i=mbzxY;i<(height-mbheight+mbzxY+1);i++)
{
// 列(除去边缘几列)
for(j=mbzxX;j<(width-mbwidth+mbzxX+1);j++)
{
k=0;
//读入模板覆盖的源图像的像素值到lssz[]中
for(l=(-mbheight+mbzxY+1);l<(mbheight-mbzxY);l++)
{
for(m=(-mbwidth+mbzxX+1);m<(mbwidth-mbzxX);m++)
{
lssz[k]=image[i+l][j+m];
k=k++;
}
}
maopao(lssz,mbSize); //对模板下的像素点进行冒泡排序
Mimage[i][j]=lssz[(mbSize-1)/2]; //将中值赋给滤波图像存放数组
}
}
fwrite(bmp_head,1,1078,zzlbFile);
//写文件
for(i=0;i<height;i++)
fwrite(Mimage[i],sizeof(unsigned char),width,zzlbFile);
//关闭文件
fclose(zzlbFile);
printf("%s文件保存完成,请按任意键退出。\n",zzlbfileName);
//成功返回
return true;
}
///////////////冒泡排序函数///////////////////
void maopao(int sz[],int Length)
{
int i,j; //循环: i控制冒泡(排序)趟数;j控制冒泡(排序)的数组长度
int lsbl; //用于交换的临时变量
/////////////冒泡排序/////////////
for(i=0;i<Length-1;i++)
{
for(j=0;j<Length-i-1;j++)
{
if(sz[j]>sz[j+1])
{
lsbl=sz[j];
sz[j]=sz[j+1];
sz[j+1]=lsbl;
}
}
}
}