自适应直方图均衡化实现了图像增强,但是为什么直方图没有均衡化啊?
void CImageDlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
int i,j,l,L,m=0;
int map[256]={0};
int Flag[256]={0};
int g[256]={0};
int h[256]={0};
int s[256]={0};
int Temp;
int T;
int B[256];
int nRst[256];
int H[256];
int D[256];
int sum;
unsigned char *lpSrc;
long m_lLineBytes;
m_hDIB3=m_hDIB;
lpDIB3 = (LPSTR)::GlobalLock(m_hDIB3);
lpDIB33 =::FindDIBBits(lpDIB3);
m_lLineBytes=WIDTHBYTES(bm.bmWidth * 8);
int lWidth = bm.bmWidth;
int lHeight = bm.bmHeight;
//int map[256]={0};
//对源图像进行统计
int StatiPixel[256];//8位 如果有要求需要换成别的位数
if(FileData1!=NULL&&FileData2!=NULL)
{
delete[] FileData1;
delete[] FileData2;
FileData2=NULL;
FileData1=NULL;
// free(FileData2);
//free(FileData1);
}
m_hDIB3=m_hDIB;
lpDIB3 = (LPSTR)::GlobalLock(m_hDIB3);
lpDIB33=::FindDIBBits(lpDIB3);
m_lLineBytes=WIDTHBYTES(bm.bmWidth * 8);
lpDIB2 =::FindDIBBits(lpDIB);
// 创建二维数组以存储图像数据!
FileData1 = new double[bm.bmHeight*bm.bmWidth ];
FileData2 = new double *[bm.bmHeight];
for(i=0;i<bm.bmHeight;i++)
{
FileData2[i] = FileData1 + i*bm.bmWidth;
}
//创建一个 m_lWidth1*m_lHeight1的二维数组FileData将图像数据导入!完毕
for(i=0; i<bm.bmHeight; i++)
{
for( j=0; j<bm.bmWidth; j++)
{
lpSrc=(unsigned char*)lpDIB3 + m_lLineBytes*(bm.bmHeight-1-i)+ j;
FileData2[i][j]=double(*lpSrc);
}
}//当前帧图像读入二维数组FileData2中!后边的计算脱离图像直接针对数组!
for(int i=0;i<256;i++)//初始化数组;
{
StatiPixel[i]=0;
}
for(int i=0;i<lHeight;i++) ////统计像素值出现次数!
{
for(int j=0; j<lWidth;j++)
{
StatiPixel[int(FileData2[i][j])]++;
//Arearect++;
}
}
l=0;
for(i=0;i<256;i++)
{
if(StatiPixel[i]>0)
Flag[l]=StatiPixel[i];
l++;
}
L=l;
//3邻域中值滤波
m=0;
int b=0;
for(j=0;j<256;j++)
{
B[j]=0;
}
Temp=0;
for(i=1;i<l ;i++)
{
if(Flag[i-1]>Flag[i])
{
Temp=Flag[i-1];
Flag[i-1]=Flag[i];
Flag[i]=Temp;
}
if(Flag[i]>Flag[i+1])
{
Temp =Flag[i];
Flag[i]=Flag[i+1];
Flag[i+1]=Temp;
}
B[i]=Flag[i];
}
D[0]=Flag[0];
D[L]=Flag[L];
for(i=1;i<L;i++)
{
D[i]=B[i];
}
//求最值
sum=0;
for(i=1;i<=L;i++)
{
h[i]=D[i]-D[i-1];
}
for(i=0;i<=L;i++)
{
if(h[i]>0)
{
s[i]=h[i];
}
else
{
s[i]=0-h[i];
}
}
// s[m]=fabs(h[m]);
//求极大值
//int c=0;
int C[256]={0};
int min=0;
int G[256]={0};
j=0;
for(m=1;m<255;m++)
{
if (h[m-1]<0,h[m+1]>0)
{
if( s[m]<(s[m-1]<=s[m+1]?s[m-1]:s[m+1]))
{
G[j]=D[m];
j++;
}
}
}
int Max=0; //求最大值
int a=0;
for(int i=0;i<j;i++)
{
if(G[i]>Max)
{
Max=G[i];
a=i;
}
}
//找出g(m)的中值T
Temp=0;
for(i=a;i<=j;i++)
{
if(G[i]<G[i+1])
{
Temp=G[i];
G[i]=G[i+1];
G[i+1]=Temp;
}
}
if((j-a+1)%2==1)
{
T=G[(j-a+3)/2];
}
else
{
T= (G[(j-a+3)/2]+G[(j-a+5)/2])/2;
}
for(i=0;i<256;i++)
{
H[i]=0;
}
for(i=0;i<=255;i++)
{
if(StatiPixel[i]>T)
{
H[i]=T;
}
else
{
H[i]=StatiPixel[i];
}
}
for(i=0;i<256;i++)
{
int sum=0;
for(j=0;j<=i;j++)
{
sum+=H[j];
}
sum=(int)(sum*255/(lHeight*lWidth));
nRst[i]=sum;
}
int temp=0;
for(i=0;i<lHeight;i++)
{
for(j=0; j<lWidth;j++)
{
lpSrc=(unsigned char*)lpDIB33+ m_lLineBytes*(lHeight-1-i)+ j;
temp=*lpSrc;
*lpSrc=nRst[temp];
FileData2[i][j]=double(*lpSrc);
}
}
pic2=true;
Invalidate(true);
}