直方图均衡
#include "stdafx.h"
#include<stdio.h>
#define N 256
int main(int argc, char* argv[])
{
FILE *in,*out;
int i,n,startadd=0,qz=1;
int a[N]={0},d[N]={0};
float b[N]={0},c[N]={0};
out=fopen("f://image2_2.bmp","wb");
if((in=fopen("f://image2.bmp","rb"))==NULL)
{
printf("can not open this file.\n");
return 0;
}
else
{
for(i=0;i<2;i++)//写文件头、信息头、调色板
{
n=fgetc(in);
fputc(n,out);
}
for(i=2;i<6;i++)
{
n=fgetc(in);
fputc(n,out);
startadd=startadd+n*qz;//将十六进制转化成十进制
qz=qz*16*16;
}
printf("%d\n",startadd);
for(i=6;i<1078;i++)
{
n=fgetc(in);
fputc(n,out);
}
for(i=1078;i<66615;i++)//计算各灰度值像素点的个数
{
n=fgetc(in);
a[n]++;
}
for(i=0;i<256;i++)//计算各灰度值的分布密度
{
b[i]=a[i]*1.0/(256*256)*1.0;
}
c[0]=b[0];//赋初值C[0]
for(i=1;i<256;i++)//进行灰度级映射和归一化
{
c[i]=c[i-1]+b[i];
}
for(i=0;i<256;i++)//映射之后的灰度级
{
d[i]=c[i]*255;
}
in=fopen("f://image2.bmp","rb");//将指针移到数据初始位置
for(i=0;i<1078;i++)
{
n=fgetc(in);
}
for(i=1078;i<66615;i++)//输出图像
{
n=fgetc(in);
fputc(d[n],out);
}
}
}