可以对8位或24位位图进行直方图均衡
均衡前的图片和直方图:
直方图均衡后的图片和直方图:
void CICETIMDlg::OnBtnGrayhistenhance()
{
// TODO: Add your control notification handler code here
int nHeight=m_dib.GetHeight();
if(nHeight==0)
{
AfxMessageBox("请先打开位图");
return;
}
int nBitCount=m_dib.GetBitCount();
int lLineBytes=m_dib.GetLineBytes();
int nWidth=m_dib.GetWidth();
BYTE* m_image=m_dib.GetDibData();
BYTE* newImage=new BYTE[nHeight*lLineBytes];
memset(newImage,0,nHeight*lLineBytes);
int nCount[256];
for(int i=0;i<256;i++)
{
nCount[i]=0;
}
for(i=0;i<nHeight;i++)
{
for(int j=0;j<lLineBytes;j++)
{
if(nBitCount==8)
{
BYTE B=*(m_image+lLineBytes*i+j);
nCount[B]++;
}
else if(nBitCount==24)
{
BYTE B=*(m_image+lLineBytes*i+j);
nCount[B]++;
j++;
j++;
}
else
{
AfxMessageBox("暂时只能处理8或24位位图");
return;
}
}
}
long lTemp=0;
for(i=0;i<256;i++)
{
lTemp+=nCount[i];
nCount[i]=(lTemp*255/nHeight/nWidth);
if(nCount[i]<0) nCount[i]=0;
if(nCount[i]>255) nCount[i]=255;
for(int m=0;m<nHeight;m++)
{
for(int n=0;n<lLineBytes;n++)
{
if(nBitCount==8)
{
if(*(m_image+lLineBytes*m+n)==i)
{
*(newImage+lLineBytes*m+n)=nCount[i];
}
}
else if(nBitCount==24)
{
if(*(m_image+lLineBytes*m+n)==i)
{
*(newImage+lLineBytes*m+n)=nCount[i];
n++;
*(newImage+lLineBytes*m+n)=nCount[i];
n++;
*(newImage+lLineBytes*m+n)=nCount[i];
n--;
n--;
}
}
else
{
AfxMessageBox("暂时只能处理8或24位位图");
return;
}
}
}
}
m_dib.SetDibData(newImage);
ShowImage(m_dib,"直方图均衡");
}