📄 mymain.c.bak
字号:
/*对一个经过matlab加高斯白噪声的图象lena20.bmp进行3*3区域算术均值滤波 */
/*该图象的原始图象是一个128*128的bmp:lenabmp*/
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#define SIZEPALETTE 256 /* 位图彩色表个数256,占用空间大小256*4 */
//#define SIZEBMP 26062 /* 位图阵列数据大小166*157 */
#define SIZEBMP 16384
typedef unsigned short int WORD;
typedef unsigned long int DWORD;
typedef unsigned char BYTE ;
typedef struct DDWORD
{
WORD highhigh;
WORD highlow;
WORD lowhigh;
WORD lowlow;
}DDWORD;
/*宏定义bmp相关数据结构*/
typedef struct tagBITMAPFILEHEADER {
DWORD bfType;
DDWORD bfSize;
DWORD bfReserved1;
DWORD bfReserved2;
DDWORD bfOffBits;
} BITMAPFILEHEADER; /*位图文件头*/
typedef struct tagBITMAPINFOHEADER{
DDWORD biSize;
DDWORD biWidth;
DDWORD biHeight;
DWORD biPlanes;
DWORD biBitCount;
DDWORD biCompression;
DDWORD biSizeImage;
DDWORD biXPelsPerMeter;
DDWORD biYPelsPerMeter;
DDWORD biClrUsed;
DDWORD biClrImportant;
} BITMAPINFOHEADER; /*位图信息头格式定义*/
typedef struct tagRGBQUAD{
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
} RGBQUAD;/*位图彩色表定义,构成包括一个3字节的RGBTRIPLE和保留字节 */
/*bmp数据结构宏定义结束*/
BITMAPFILEHEADER bmfHeader; /*位图文件头*/
BITMAPINFOHEADER bmiHeader; /*位图信息头 */
RGBQUAD m_Palette[SIZEPALETTE]; /*位图彩色表数组*/
BYTE m_ImageOld[SIZEBMP]; /*含噪图象阵列数据*/
BYTE m_ImageNew[SIZEBMP]; /*滤波图象阵列数据*/
main()
{
int i,j;
int m,n;
int width=128;
int height=128;
FILE *fpin;
FILE *fpout;
long space;
float coffi=1.0/9.0;
double sum;
/*读取文件fpin->lena20.bmp,将彩色表信息读进m_Palette中,阵列数据读入m_ImageOld中*/
fpin=fopen("E:\\myccspro\\ccs2.20\\lenaArith\\lena20.bmp","r");
if(fpin==NULL)
{
puts("Can't open the file lena20.bmp!\n");
exit(0);
}
fread(&bmfHeader,14,1,fpin); /*获取位图文件头*/
fread(&bmiHeader,40,1,fpin); /*获取位图信息头*/
printf("The lena20 bmp's width is %d\n",bmiHeader.biWidth.highhigh);
printf("The lena20 bmp's heigh is %d\n",bmiHeader.biHeight.highhigh);
//width=bmiHeader.biWidth.highhigh;
//height=bmiHeader.biHeight.highhigh;
space=width*height;
printf("The lena20 bmp squre is %ld\n",space);
fseek(fpin,54,0);
fread(m_Palette,SIZEPALETTE*4,1,fpin); /*将彩色表数据读入到m_Palette中*/
fread(m_ImageOld,SIZEBMP,1,fpin); /*将含噪声位图阵列数据读入m_ImageOld中*/
fclose(fpin);
/* 进行3*3区域算术均值滤波*/
/* 算术均值滤波:除去四个边框外,其余点的象素值是以该点为中心的3*3块的数据均值*/
for(i=0;i<height;i++)
{
for(j=0;j<width;j++)
{
printf("Filter one started (%d,%d)!",i,j);
//为统计变量赋初始值
sum=0;
//对于图像的4个边框的象素保持数据不变
if( j<1 || j>(width-2)|| i<1 || i>(height-2) )
m_ImageNew[width*j+i]=m_ImageOld[width*j+i];
//对于其他的象素进行均值操作
else
{
//将点(i,j)点作为计算的中心
for(m=(i-1);m<=(i+1);m++)
{
for(n=(j-1);n<=(j+1);n++)
//将以点(i,j)为中心,大小为3*3范围内的数据线性叠加
sum+=m_ImageOld[width*j+i];
}
//将结果乘上系数
sum=(int)sum*coffi;
//计算绝对值
sum = fabs(sum);
//如果小于0,强制赋值为0
if(sum<0)
sum=0;
//如果大于255,强制赋值为255
if(sum>255)
sum=255;
//将计算的结果放到新的位图的相应位置
m_ImageNew[width*j+i]=sum;
}
puts("Successfully one\n!");
}
}
puts("Filter sucessfully!\n");
/*将得到的新数据以及原有的文件头,文件信息头,彩色表信息写入输出文件*/
fpout=fopen("E:\\myccspro\\ccs2.20\\lenaArith\\lenaout.bmp","w");
if(fpout==NULL)
{
puts("Can't open the file lenaout.bmp!\n");
exit(0);
}
fwrite(&bmfHeader,14,1,fpout);
fwrite(&bmiHeader,40,1,fpout);
fwrite(m_Palette,SIZEPALETTE*4,1,fpout);
fwrite(m_ImageNew,SIZEBMP,1,fpout);
fclose(fpout);
fpout=fopen("E:\\myccspro\\ccs2.20\\lenaArith\\lenaout.dat","w");
if(fpout==NULL)
{
puts("Can't open the file lenaout.dat!\n");
exit(0);
}
fwrite(&bmfHeader,14,1,fpout);
fwrite(&bmiHeader,40,1,fpout);
fwrite(m_Palette,SIZEPALETTE*4,1,fpout);
fwrite(m_ImageNew,SIZEBMP,1,fpout);
fclose(fpout);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -