#include <fstream>
#include <math.h>
#include <stdio.h>
#include <windows.h>
#include <iostream>
using namespace std;
int sort(int a[])
{
int temp=0;
for(int i=0;i<9;i++)
{
for(int j=i;j<9;j++)
{
if(a[i]>=a[j])
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
return a[4];
}
int main()
{
//定义原始图像的宽和高
unsigned int Height = 0;
unsigned int Width = 0;
//定义循环变量
int i=0;
int j=0;
BITMAPFILEHEADER bmpfileheader; //文件头
BITMAPINFOHEADER bmpinfoheader; //信息头
//24位像素点RGB结构体
typedef struct tagRGB
{
BYTE blue;
BYTE green;
BYTE red;
}RGBDATA;
FILE *fpin; //读取操作流
FILE *fpout; //读出操作流
fpin=fopen("picture.bmp","rb");
fread(&bmpfileheader,sizeof(BITMAPFILEHEADER),1,fpin);//读取文件头
fread(&bmpinfoheader,sizeof(BITMAPINFOHEADER),1,fpin);//读取信息头
Height=bmpinfoheader.biHeight;
Width=bmpinfoheader.biWidth;
//动态创建二维数组
RGBDATA** RGBin;
RGBin = (RGBDATA **)malloc(sizeof(RGBDATA*) * Height);
for (i = 0; i < Height; i++)
{
RGBin[i] = (RGBDATA *)malloc(sizeof(RGBDATA) * Width);
}
//读入像素信息
for(i=0;i<Height;i++)
{
fread(RGBin[i], sizeof(tagRGB), Width, fpin);
}
//动态创建二维数组
RGBDATA** RGBout;
RGBout = (RGBDATA **)malloc(sizeof(RGBDATA*) * Height);
for (i = 0; i < Height; i++)
{
RGBout[i] = (RGBDATA *)malloc(sizeof(RGBDATA) * Width);
}
int R[9]={0};
int G[9]={0};
int B[9]={0};
//将原始图像加均值滤波
for(i=0;i<Height;i++)
{
for(j=0;j<Width;j++)
{
if(i>0&&i<Height-1&&j>0&&j<Width-1)
{
R[0]=RGBin[j-1][i+1].red;
R[1]=RGBin[j][i+1].red;
R[2]=RGBin[j+1][i+1].red;
R[3]=RGBin[j-1][i].red;
R[4]=RGBin[j][i].red;
R[5]=RGBin[j+1][i+1].red;
R[6]=RGBin[j-1][i-1].red;
R[7]=RGBin[j][i-1].red;
R[8]=RGBin[j+1][i-1].red;
G[0]=RGBin[j-1][i+1].green;
G[1]=RGBin[j][i+1].green;
G[2]=RGBin[j+1][i+1].green;
G[3]=RGBin[j-1][i].green;
G[4]=RGBin[j][i].green;
G[5]=RGBin[j+1][i+1].green;
G[6]=RGBin[j-1][i-1].green;
G[7]=RGBin[j][i-1].green;
G[8]=RGBin[j+1][i-1].green;
B[0]=RGBin[j-1][i+1].blue;
B[1]=RGBin[j][i+1].blue;
B[2]=RGBin[j+1][i+1].blue;
B[3]=RGBin[j-1][i].blue;
B[4]=RGBin[j][i].blue;
B[5]=RGBin[j+1][i+1].blue;
B[6]=RGBin[j-1][i-1].blue;
B[7]=RGBin[j][i-1].blue;
B[8]=RGBin[j+1][i-1].blue;
RGBout[j][i].blue=sort(B);
RGBout[j][i].green=sort(G);
RGBout[j][i].red=sort(R);
}
else
{
RGBout[j][i]=RGBin[j][i];
}
}
}
//将信息写入文件
fpout=fopen("picture_out.bmp","wb");
fwrite(&bmpfileheader,sizeof(BITMAPFILEHEADER),1,fpout);
fwrite(&bmpinfoheader,sizeof(BITMAPINFOHEADER),1,fpout);
for (i=0;i<Height;i++)
{
fwrite(RGBout[i],sizeof(tagRGB),Width,fpout);
}
printf("生成新图片成功!\n");
fclose(fpin);
fclose(fpout);
return 0;
}
处理前
处理后