直方图均衡

本文介绍了一种实现8位和24位位图直方图均衡的方法。该方法首先统计图像中各灰度级出现的频率,然后通过累积分布函数将原始灰度映射到新的灰度值,从而改善图像对比度。
可以对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,"直方图均衡");
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值