#include
#include
#include
#include
bool InitBITMAP(BITMAP* bmp);
void InitHist(unsigned char* pImg,int imageSize);
int GetBrightNess(unsigned long* LUT,int imageSize);
double GetContrast(unsigned long* LUT,int imageSize, int brightness);
void ChangeU_AND_D(unsigned char* pImg,int imageSize);
void saveBmp(BITMAP* bmp);
char* fileName="d:\\new.bmp";
char* saveFileName="D:\\myLena.bmp";
unsigned long HIST[256];
unsigned long LUT[256];
void saveBmp(BITMAP* bmp)
{
FILE* fp=fopen(fileName,"rb");
BITMAPFILEHEADER bh;
fread(&bh,sizeof(BITMAPFILEHEADER),1,fp);
unsigned char* imageHead=new unsigned char[bh.bfOffBits];
fseek(fp,0,SEEK_SET);
fread(imageHead,1,bh.bfOffBits,fp);
fclose(fp);
fp=fopen(saveFileName,"wb");
if(!fp)
{
printf("error in saveBmp!");
return;
}
fwrite(imageHead,bh.bfOffBits,1,fp);
fwrite(bmp->bmBits,1,bmp->bmHeight*bmp->bmWidth,fp);
fclose(fp);
}
bool InitBITMAP(BITMAP* bmp)
{
FILE* fp=fopen(fileName,"rb");
if(!fp)
{
printf("error in fp init!");
return false;
}
fseek(fp,sizeof(BITMAPFILEHEADER),SEEK_SET);
BITMAPINFOHEADER bInfo;
fread(&bInfo,sizeof(BITMAPINFOHEADER),1,fp);
bmp->bmBitsPixel=bInfo.biBitCount;
bmp->bmHeight=bInfo.biHeight;
bmp->bmWidth=bInfo.biWidth;
bmp->bmPlanes=bInfo.biPlanes;
bmp->bmType=0;
bmp->bmWidthBytes=(bInfo.biWidth+3)/4*4;
unsigned char* image=new unsigned char[bmp->bmHeight*bmp->bmWidth];
fread(image,1,bmp->bmWidthBytes*bmp->bmHeight,fp);
bmp->bmBits=image;
fclose(fp);
return true;
}
void InitHist(unsigned char* pImg,int imageSize)
{
memset(HIST,0,sizeof(unsigned long)*256);//理解一下
unsigned char* pEnd=pImg+imageSize;
unsigned char* pCur=pImg;
while(pCur
{
HIST[*pCur++]++;
}
}
void InitLUT(int u0, double d0, int u1, double d1)
{
memset(LUT,0,sizeof(unsigned long)*256);
for(int i=0;i<256;i++)
{
LUT[i]=(unsigned long)min(255,max((i-u0)/d0*d1+u1,0));//LUT[I]是在(0,255)之间的
//cout<
}
}
void main()
{
BITMAP bmp;
if(InitBITMAP(&bmp))
{
intimageSize=bmp.bmWidth*bmp.bmHeight;
InitHist((unsigned char*)bmp.bmBits,imageSize);
int brightness;
brightness=GetBrightNess(HIST,imageSize);
double contrast;
contrast=GetContrast(HIST,imageSize, brightness);
cout<
//
// change brightness and contrast
int u1;
double d1;
cout<
cin>>u1>>d1;
InitLUT(brightness,contrast,u1,d1);
ChangeU_AND_D((unsigned char*)bmp.bmBits,imageSize);
InitHist((unsigned char*)bmp.bmBits,imageSize);
brightness=GetBrightNess(HIST,imageSize);
contrast=GetContrast(HIST,imageSize, brightness);
cout<
//
//save the changed image.
saveBmp(&bmp);
}
}
int GetBrightNess(unsigned long* LUT,int imageSize)
{
int sum=0;
for(int i=0;i<256;i++)
sum+=LUT[i]*i;
return sum/imageSize;
}
double GetContrast(unsigned long* LUT,int imageSize, int brightness)
{
int sum=0;
for(int i=0;i<256;i++)
{
//sum+= pow((i-brightness),2)*LUT[i];//pow中的参数是double型的。
sum+=(i-brightness)*(i-brightness)*LUT[i];//此是int型的相乘
}
return sqrt(sum/imageSize);
}
void ChangeU_AND_D(unsigned char* pImg,int imageSize)
{
unsigned char* pCur=pImg;
unsigned char* pEnd=pImg+imageSize;
while(pCur
{
*pCur++=(unsigned char)LUT[*pCur];
}
}