直方图均衡

    技术2022-05-11  34

    可以对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,"直方图均衡"); }

    最新回复(0)