数字图像处理-中值滤波C++程序

  • 格式:txt
  • 大小:4.93 KB
  • 文档页数:2

/*
filter.c
*/


#include
#include


/*
定义头文件型
*/
typedef struct
{
unsigned char id1,id2;//图片文件类型;
unsigned int filesize;//文件总大小;
unsigned int reserved;//保留,置零;
unsigned int bitmapdataoffset;//
unsigned int bitmapheadersize;//头文件数据大小;
unsigned int width;//图片宽度;
unsigned int height;//图片高度;
unsigned short planes;//图片位面数;
unsigned short bitperpixel;//每像素比特数;
unsigned int compression;//是否压缩;
unsigned int bitmapdatasize;//图片数据大小;
unsigned int hresolution;//水平分辨率;
unsigned int vresolution;//垂直分辨率;
unsigned int colors;//颜色数;
unsigned int importantcolors;//重要颜色数:
unsigned char palette[256][4];//调色板;
unsigned char bitmapdata[256][256];//图片数据;
}BMPheaderfile;


/*
用于获取文件长度的函数
*/
long getfilesize(FILE* f)
{
long pos,len;
pos=ftell(f);
fseek(f,0,SEEK_END);
len=ftell(f);
fseek(f,pos,SEEK_SET);
return len;
}


/*
主函数
*/
void main()
{
FILE* fpr;//读文件指针;
FILE* fpw;//写文件指针;
BMPheaderfile BMPheader;//头文件型变量;
unsigned char* data;//读取到的数据;
unsigned char* buffer;//数据缓存;
int i,j;
int h,w;
unsigned char num[5];
unsigned char t;
long length;//文件长度;
long position;//用于察看指针所在位置;


/*
打开文件
*/
if((fpr=fopen("girl2.bmp","rb"))==NULL)
{
printf("cannot read this file\n");
exit(0);
}
if((fpw=fopen("ogirl2.bmp","wb"))==NULL)
{
printf("cannot write this file\n");
exit(0);
}


/*
获取文件数据的总大小;
*/
length=getfilesize(fpr);
printf("\nfilesize %ld\n",length);

data=(unsigned char*)malloc((length-1078)*sizeof(char));//为数据分配内存空间;


/*
获取取头文件信息
*/
fread(data,1,length,fpr);

buffer=data;

BMPheader.id1=*buffer++;
BMPheader.id2=*buffer++;
printf("\nfile ID %c %c\n",BMPheader.id1,BMPheader.id2);

BMPheader.filesize=*(int*)buffer;
printf("filesize %d\n",BMPheader.filesize);

buffer+=4;

BMPheader.reserved=*(int*)buffer;
printf("reserved %d\n",BMPheader.reserved);

buffer+=4;

BMPheader.bitmapdataoffset=*(int*)buffer;
printf("bitmapdataoffset %d\n",BMPheader.bitmapdataoffset);

buffer+=4;

BMPheader.bitmapheadersize=*(int*)buffer;
printf("bitmapheadersize %d\n",BMPheader.bitmapheadersize);

buffer+=4;

BMPheader.width=*(int*)buffer;
printf("width %d\n",BMPheader.width);

buffer+=4;

BMPheader.height=*(int*)buffer;
printf("height %d\n",BMPheader.height);

buffer+=4;

BMPheader.planes=*(short*)buffer;
printf("planes %hd\n",BMPheader.planes);

buffer+=2;

BMPheader.bitperpixel=*(short*)buffer;
printf("bitperpixel %hd\n",BMPheader.bitperpixel);

buffer+=2;

pression=*(int*)buffer;
printf("compression %d\n",pression);

buffer+=4;

BMPheader.bitmapdatasize=*(int*)buffer;
printf("bitmapdatasize %d\n",BMPheader.bitmapdatasize);

buffer+=4;

BMPheader.hresolution=*(int*)buffer;
printf("hresolution %d\n",BMPheader.hresolution);

buffer+=4;

BMPheader.vresolution=*(int*)buffer;
printf("vresolution %d\n",BMPheader.vresolution);

buffer+=4;

BMPheader.colors=*(int*)buffer;
printf("colors %d\n",BMPheader.colors);

buffer+=4;

BMPheader.importantcolors=*(int*)buffer;
printf("importantcolors %d\n",BMPheader.importantcolors);

buffer+=4;

for(i=0;i<256;i++)
{
for(j=0;j<4;j++)
{
BMPheader.palette[i][j]=*buffer++;//获取调色板数据;
}
}
position=ftell(fpr);
printf("position of fpr %d\n",position);

for(i=0;i<256;i++)
{
for(j=0;j<256;j++)
{
BMPheader.bitmapdata[i][j]=*buffer++;//获取图片数据;
}
}


/*
N=3的中值滤波
*/
/*for(h=0;h<256;h++)
{
for(w=0;w<256;w++)
{
num[0]=BMPheader.bitmapdata[h][w-1];
num[1]=BMPheader.bitmapdata[h][w];
num[2]=BMPheader.bitmapdata[h][w+1];
for(i=0;i<3;i++)
{
for(j=i;j<3;j++)
{
if(num[i]>num[j])
{
t=num[j];
num[j]=num[i];
num[i]=t;
}
}
}
BMPheader.bitmapdata[h][w]=num[1];
}
}*/


/*
N=5的中值滤波
*/
for(h=0;h<256;h++)
{
for(w=0;w<256;w++)
{
num[0]=BMPheader.bitmapdata[h][w-2];
num[1]=BMPheader.bitmapdata[h][w-1];
num[2]=BMPheader.bitmapdata[h][w];
num[3]=BMPheader.bitmapdata[h][w+1];
num[4]=BMPheader.bitmapdata[h][w+2];

for(i=0;i<5;i++)
{
for(j=i;j<5;j++)
{
if(num[i]>num[j])
{
t=num[j];
num[j]=num[i];
num[i]=t;
}
}
}

BMPheader.bitmapdata[h][w]=num[2];
}
}


/*
将滤波后的数据写入文件
*/
fseek(fpw,0,0);
fwrite(data,1,1078,fpw);//写入头文件信息;
position=ftell(fpw);
printf("position of fpw %d\n",position);

fwrite(BMPheader.bitmapdata,1,length-1078,fpw);//写入图片数据;
position=ftell(fpw);
printf("position of fpw %d\n",position);

system("pause");
fclose(fpr);
fclose(fpw);
}

下载文档原格式

  / 2
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。