自适应直方图均衡化实现了图像增强,但是为什么直方图没有均衡化啊?

love05071027 2011-05-25 02:34:11
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);


}
...全文
286 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
tt2com 2011-05-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 love05071027 的回复:]
但是我自己的算法是看不出来哪里错了啊?运行结果是图像增强了,但是它的直方图并没有均衡化
[/Quote]
说说你的算法,你的代码太长了,估计要很有耐心的人才会看
love05071027 2011-05-25
  • 打赏
  • 举报
回复
但是我自己的算法是看不出来哪里错了啊?运行结果是图像增强了,但是它的直方图并没有均衡化
sunyim 2011-05-25
  • 打赏
  • 举报
回复
直方图是根据定义来的

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧