#include<stdio.h>
#include<stdlib.h>
#include<memory.h>
#include"hdr.h"
//定义结构指针
struct bmphdr*hdr;
//定义用于直方图变量
unsigned char *bitmap, new_color[256];
//定义计算灰度分布,灰度累计分布的数组
int count[256], acum[256];
//main()函数编写
int main(int argc,char *argv[])
{
//定义整数 i, j 用于函数循环时的,nr_pixels为图像中像素的个数
int i, j, nr_pixels;
//定义两个文件指针分别用于提取原图像的数据和生成直方图均衡化后的图像
FILE *fp, *fpnew;
//定义主函数的参数包括:输入的位图文件名和输出的位图文件名,此处内容可以不要,
//在DOS下执行命令的时候再临时输入也可,为了方便演示,我这里直接把函数的参数确定了。
//参数输入出错显示
if (argc != 3)
{
printf("please input the name of input and out bitmap files\n");
exit(1);
}
// 获取位图文件相关信息
hdr=get_header(argv[1]);//调用hdr.c中的get_header函数尝试以二进制的方式读取文件头部信息
if(!hdr)
exit(1);
//以二进制可读方式打开输入位图文件
fp=fopen(argv[1],"rb");//尝试以二进制的方式读取文件头部信息
if(!fp)
{
printf("File open error!\n");
exit(1);
}
// 文件指针指向数据区域
fseek(fp,hdr->offset,SEEK_SET);//定位到图像真正的开始处
//计算位图像素的个数
nr_pixels=hdr->width*hdr->height;//总的像素=宽*高
bitmap=malloc(nr_pixels);
//读取位图数据到bitmap中
fread(bitmap,nr_pixels,1,fp);
fclose(fp);
memset(count, 0, sizeof(count));
//计算每个灰度级上像素的个数 结果存入count[]数组中
for(i=0;i<nr_pixels;i++)
for(j=0;j<256;j++)
{
if( bitmap[i]==j)
count[j]++;
}
memcpy(acum, count, sizeof(acum));
//计算灰度的累计分布
for (i = 1; i < 256; i++)
acum[i] += acum[i-1];
//灰度直方图的均衡化(核心程序部分,请仔细分析)为了方便大家编程实现,这里直接给出了源代码,
//本实验最核心的部分就在这里
for (i = 0; i < 256; i++)
{
j=(int)(acum[i]/(1.0*nr_pixels)*255+0.5);
new_color[i]=j;//定义新的灰度对应规则 new_color[i]; 其中 0<=i<=255
}
//对所有的像素灰度值按照均衡化得到的灰度对应规则进行转换,结果存入bitmap[]中
for (i = 0; i < nr_pixels; i++)
bitmap[i]=new_color[bitmap[i]];
// 打开一个以输出文件名命名的文件,设为可写的二进制形式
fpnew = fopen(argv[2], "wb+");
//由于位图文件的头部信息并没有因直方图均衡化而改变,因此输出图像的头部信息从原位图文件中拷贝即可:
fwrite(hdr->signature, 2, 1, fpnew);
fwrite(&hdr->size, 4, 1, fpnew);
fwrite(hdr->reserved, 4, 1, fpnew);
fwrite(&hdr->offset, 4, 1, fpnew);
fwrite(&hdr->hdr_size, 4, 1, fpnew);
fwrite(&hdr->width, 4, 1, fpnew);
fwrite(&hdr->height, 4, 1, fpnew);
fwrite(&hdr->nr_planes, 2, 1, fpnew);
fwrite(&hdr->bits_per_pixel, 2, 1, fpnew);
fwrite(&hdr->compress_type, 4, 1, fpnew);
fwrite(&hdr->data_size, 4, 1, fpnew);
fwrite(&hdr->resol_hori, 4, 1, fpnew);
fwrite(&hdr->resol_vert, 4, 1, fpnew);
fwrite(&hdr->nr_colors, 4, 1, fpnew);
fwrite(&hdr->important_color, 4, 1, fpnew);
if (hdr->offset > 54)
fwrite(hdr->info, (hdr->offset - 54), 1, fpnew);
//直方图均衡化的数据(bitmap)赋值
fwrite(bitmap,nr_pixels,1,fpnew);
//关闭
fclose(fpnew);
//释放内存(优化程序必需)
free(hdr);
free(bitmap);
}