直⽅图均衡化算法代码做了⼀天,都是⿊屏,最后发现,竟然是⼀个局部变量引起。
基本是分3步,这个是在灰度图像下实现均衡化直⽅图。彩⾊下直接均衡化研究出来再补上。第⼀步:
计算初始直⽅图,即记录每⼀个像素出现次数。
for(int y =0; y < m_image->GetHeight(); y++)
{
for(int x =0; x < m_image->GetWidth();x++)
{
COLORREF rgb = m_image->GetPixel(x,y);
int rValue  = GetRValue(rgb);  //记录每⼀个像素出现次数。
hist[rValue]++;
}
}
第⼆步:
由上⾯得到的初始直⽅图计算归⼀化直⽅图和累积直⽅图
int hist[256]= {0};
double phist[256];
for (int i =0; i <=255 ;i++)
{
phist [i]= (double) hist[i]/ (m_image->GetHeight() * m_image->GetWidth());  //归⼀化直⽅图即每个像素出现概率}
double dSum[256]= {0.0};
for(int i =0; i<=255;i++)局部直方图均衡化
{
if(i !=0)
{
dSum[i]= dSum[i-1]+ phist[i];
}
else//累积直⽅图
{
dSum[i]= phist[i];
}
}
第三步:
求均衡化映射(旧图->新图)关系,并写⼊新图像
for(int y =0; y < m_image->GetHeight(); y++)
{
for(int x =0; x < m_image->GetWidth();x++)
{
COLORREF rgb = m_image->GetPixel(x,y);
int rValue = GetRValue(rgb);
rValue = Mapping[rValue];        //根据映射关系实现均衡化
rgb = RGB(rValue,rValue,rValue);
m_image->SetPixel(x,y,rgb);
}
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。