c语言bmp图像亮度调节,获得和改变bmp图像的亮度对比度

#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];

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值