?? mymain1
字號:
/*對一個經過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 1024 /*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=32;
int height=32;
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\\lena201.bmp","r");
if(fpin==NULL)
{
puts("Can't open the file lena201.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);
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=(height-1);i>=0;i--)
{
for(j=0;j<width;j++)
{
printf("Filter one started (%d,%d)-%d!",i,j,width*(height-i-1)+j);
//為統計變量賦初始值
sum=0;
//對于圖像的4個邊框的象素保持數據不變
if( j<1 || j>(width-2)|| i<1 || i>(height-2))
m_ImageNew[width*(height-i-1)+j]=m_ImageOld[width*(height-i-1)+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*(height-i-1)+j];
}
//將結果乘上系數
sum=(int)sum*coffi;
//計算絕對值
sum = fabs(sum);
//如果小于0,強制賦值為0
if(sum<0)
sum=0;
//如果大于255,強制賦值為255
if(sum>255)
sum=255;
//將計算的結果放到新的位圖的相應位置
m_ImageNew[width*(height-i-1)+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 + -