⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mymain.c

📁 ccs2.20中调试的均值滤波程序
💻 C
字号:
/*对一个经过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  /*位图阵列数据大小128*128*/
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;  
  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); 
 
  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)-%d!",i,j,width*i+j);
		   //为统计变量赋初始值
	       sum=0;
         //对于图像的4个边框的象素保持数据不变
	     if( j<1 || j>(width-2)|| i<1 || i>(height-2))
	       m_ImageNew[width*i+j]=m_ImageOld[width*i+j];		 
         //对于其他的象素进行均值操作
		 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*m+n];		  
		  }          
		  //将结果乘上系数
          sum=(int)sum*coffi;
		  //计算绝对值
		  sum = fabs(sum);
		  //如果小于0,强制赋值为0
          if(sum<0)     
          sum=0;
		  //如果大于255,强制赋值为255
          if(sum>255)
		  sum=255;
		  //将计算的结果放到新的位图的相应位置
	      m_ImageNew[width*i+j]=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 + -