#include<stdio.h>
#include<windows.h>
#include<math.h>
#define L_Y 3//定义邻域的大小
void InitImage(BYTE *image[2000],int h,int w);//建立存放raw格式的图像矩阵
void ReadRawFile(BYTE *image[2000], int w, int h, char filepath[200]);//将图像读入矩阵image当中
void SaveRawFile(BYTE *image[2000], int w, int h, char filepath[200]);//保存数组内容到制定的文件中
int MedianValue(BYTE *Array,int filterlen);//获取中值,以便做中值滤波处理时用
void MedianFilter(BYTE *image[2000],int h,int w,BYTE *image1[2000]);//中值滤波
void JZ_Filter(BYTE *image[2000],int h,int w,BYTE *image2[2000]);//均值滤波
void main()
{
BYTE *image1[2000],*image2[2000],*image3[2000];//定义2个数组
InitImage(image1,512,512);//初始话数组
InitImage(image2,512,512);
ReadRawFile(image1,512,512,"E:\\mybook\\Lena_dhzs.raw");//读文件赋值给image
MedianFilter(image1,512,512,image2);//中值滤波
// JZ_Filter(image1,512,512,image3);//均值滤波
SaveRawFile(image2,512,512,"E:\\mybook\\Lena11.raw");
// SaveRawFile(image3,512,512,"d:\\Lena_11JZF.raw");
}
void InitImage(BYTE *image[2000],int h,int w)//建立存放raw格式的图像矩阵
{
for(int i=0;i<h;i++)
image[i]=(BYTE *)new BYTE[w];
for(i=0;i<h;i++)
for(int j=0;j<w;j++)
image[i][j]=0;
}
void ReadRawFile(BYTE *image[2000], int w, int h, char filepath[200])//将图像读入矩阵image当中
{ FILE *fp=fopen(filepath,"rb");
if(fp==NULL)
{printf("error open %s\n",filepath);exit(0);}
for(int i=0;i<h;i++)
fread(image[i],1,512,fp);
fclose(fp);
}
void SaveRawFile(BYTE *image[2000], int w, int h, char filepath[200])//保存数组内容到制定的文件中
{ FILE *fp=fopen(filepath,"wb");
if(fp==NULL)
{printf("cannot open file %s to write\n",filepath);exit(0);}
for(int i=0;i<h;i++)
fwrite(image[i],1,w,fp);
fclose(fp);
}
int MedianValue(BYTE *Array,int filterlen)//获取中值,以便做中值滤波处理时用
{
int i,j;
BYTE temp;
for(j=0;j<filterlen-1;j++)//利用冒泡法对一维数组进行排序,并取中间值返回
{ for(i=0;i<filterlen-1-j;i++)
{ if(Array[i]>Array[i+1])
{ temp=Array[i];
Array[i]=Array[i+1];
Array[i+1]=temp;
}
}
}
temp=Array[(filterlen+1)/2];
return(temp);
}
void MedianFilter(BYTE *image[2000],int h,int w,BYTE *image1[2000])//中值滤波
{
int i,j,k,l,T;
BYTE temp; //存放过度点
BYTE Median[L_Y*L_Y]; //存放(i,j)点的3邻域的个数
for(i=(int)(L_Y/2);i<h-(int)(L_Y/2);i++)
{ for(j=(int)(L_Y/2);j<w-(int)(L_Y/2);j++)
{
{ T=0;k=0;l=0;//提取所求邻域的点存放入Median[T]数组
for(k=i-(int)(L_Y/2);k<=i+(int)(L_Y/2);k++)
{for(l=j-(int)(L_Y/2);l<=j+(int)(L_Y/2);l++)
{ Median[T]=image[k][l];
T++;
}
}
temp=MedianValue(Median,L_Y*L_Y);//调用函数获得所求邻域的中值
image1[i][j]=temp;
}
}
}
}
void JZ_Filter(BYTE *image[2000],int h,int w,BYTE *image3[2000])//均值滤波
{
int i,j,k,l;
int temp=0;//
for(i=(int)(L_Y/2);i<h-(int)(L_Y/2);i++)
{ for(j=(int)(L_Y/2);j<w-(int)(L_Y/2);j++)
{
for(k=i-(int)(L_Y/2);k<=i+(int)(L_Y/2);k++)
{for(l=j-(int)(L_Y/2);l<=j+(int)(L_Y/2);l++)
temp+=image[k][l];
}
image3[i][j]=(BYTE)(temp/(L_Y*L_Y));
temp=0;//忘记将其初始化
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
前往页