//图像灰度均衡
int GrayEqualize(BYTE *image,DWORD dwWidth,DWORD dwHeight,WORD wBitCount)
{
DWORD height=dwHeight;
DWORD width=dwWidth;
WORD bitCount=wBitCount;
DWORD lineBytes=(width*bitCount+31)/32*4;
BYTE *temp=image;
BYTE grayMap[256];
DWORD grayNum[256];
BYTE BgrayMap[256];
DWORD BgrayNum[256];
BYTE GgrayMap[256];
DWORD GgrayNum[256];
BYTE RgrayMap[256];
DWORD RgrayNum[256];
DWORD i=0;
DWORD j=0;
int n=0;
int m=0;
BYTE b=0;
BYTE g=0;
BYTE r=0;
long c=0;
long bc=0,gc=0,rc=0;
if(temp==NULL)
{
return -1;
}
for(n=0;n<256;n++)
{
grayNum[n]=0;
grayMap[n]=0;
BgrayNum[n]=0;
BgrayMap[n]=0;
GgrayNum[n]=0;
GgrayMap[n]=0;
RgrayNum[n]=0;
RgrayMap[n]=0;
}
if(bitCount==8)
{
for(i=0;i<height;i++)
{
for(j=0;j<width;j++)
{
g=*(temp+lineBytes*(height-1-i)+j);
grayNum[g]++;
}
}
for(n=0;n<256;n++)
{
c=0;
for(m=0;m<=n;m++)
{
c+=grayNum[m];
}
grayMap[n]=(BYTE)(c*255/height/width);
}
for(i=0;i<height;i++)
{
for(j=0;j<width;j++)
{
g=*(temp+lineBytes*(height-1-i)+j);
*(temp+lineBytes*(height-1-i)+j)=grayMap[g];
}
}
}
else if(bitCount==24)
{
for(i=0;i<height;i++)
{
for(j=0;j<width*3;j++)
{
b=*(temp+lineBytes*(height-1-i)+j);
j++;
g=*(temp+lineBytes*(height-1-i)+j);
j++;
r=*(temp+lineBytes*(height-1-i)+j);
BgrayNum[b]++;
GgrayNum[g]++;
RgrayNum[r]++;
}
}
for(n=0;n<256;n++)
{
bc=0;gc=0;rc=0;
for(m=0;m<=n;m++)
{
bc+=BgrayNum[m];
gc+=GgrayNum[m];
rc+=RgrayNum[m];
}
BgrayMap[n]=(BYTE)(bc*255/height/width);
GgrayMap[n]=(BYTE)(gc*255/height/width);
RgrayMap[n]=(BYTE)(rc*255/height/width);
}
for(i=0;i<height;i++)
{
for(j=0,n=0;j<width*3;j++,n++)
{
b=*(temp+lineBytes*(height-1-i)+j);
j++;
g=*(temp+lineBytes*(height-1-i)+j);
j++;
r=*(temp+lineBytes*(height-1-i)+j);
*(temp+lineBytes*(height-1-i)+n)=BgrayMap[b];
n++;
*(temp+lineBytes*(height-1-i)+n)=GgrayMap[g];
n++;
*(temp+lineBytes*(height-1-i)+n)=RgrayMap[r];
}
}
}
else
{
return -1;
}
return 0;
}
//图像线性灰度变换
int LineTranslation(BYTE *image,DWORD dwWidth,DWORD dwHeight,
WORD wBitCount,double k,double d)
{
DWORD dwLineBytes=(dwWidth*wBitCount+31)/32*4;
DWORD i=0;
DWORD j=0;
DWORD n=0;
BYTE b=0;
BYTE g=0;
BYTE r=0;
double nb=0;
double ng=0;
double nr=0;
double f=0;
if(image==NULL)
{
return -1;
}
if(wBitCount==8)
{
for(i=0;i<dwHeight;i++)
{
for(j=0;j<dwWidth;j++)
{
g=*(image+dwLineBytes*(dwHeight-1-i)+j);
f=g*k+d;
if(f>255) f=255;
if(f<0) f=0;
*(image+dwLineBytes*(dwHeight-1-i)+j)=(BYTE)f;
}
}
}
else if(wBitCount==24)
{
for(i=0;i<dwHeight;i++)
{
for(j=0,n=0;j<dwWidth*3;j++,n++)
{
b=*(image+dwLineBytes*(dwHeight-1-i)+j);
j++;
g=*(image+dwLineBytes*(dwHeight-1-i)+j);
j++;
r=*(image+dwLineBytes*(dwHeight-1-i)+j);
nb=b*k+d;
if(nb>255) nb=255;
if(nb<0) nb=0;
ng=g*k+d;
if(ng>255) ng=255;
if(ng<0) ng=0;
nr=r*k+d;
if(nr>255) nr=255;
if(nr<0) nr=0;
*(image+dwLineBytes*(dwHeight-1-i)+n)=(BYTE)nb;