VC下通过直方图变换对图像进行有效增强
2008-11-14 19:33:58 来源:WEB开发网for(DWORD i=54;i<m_dwFileLen;i++)
{
ns_r[m_cpBuffer[i]]++; //ns_r[k]为k灰度级像素数,m_cpBuffer[i]为当前的灰度值
i++;
ns_g[m_cpBuffer[i]]++;//ns_g为G分量的统计记数
i++;
ns_b[m_cpBuffer[i]]++;//ns_b为B分量的统计记数
}
for(i=0;i<256;i++) //计算R、G、B三分量的直方图分布
{
ps_r[i]=ns_r[i]/((m_dwFileLen-54)/3.0f); //ps_r[i]为R分量中i灰度级出现的概率
ps_g[i]=ns_g[i]/((m_dwFileLen-54)/3.0f); //ps_b[i]为G分量中i灰度级出现的概率
ps_b[i]=ns_b[i]/((m_dwFileLen-54)/3.0f); //ps_b[i]为B分量中i灰度级出现的概率
}
然后计算R、G、B三分量各灰度级的累计直方图分布,并对其进行取整以得出源和目标图像灰度之间的映射关系:
for(i=0;i<256;i++)
{
//计算累计直方图分布
temp_r[i]=temp_r[i-1]+ps_r[i];
temp_g[i]=temp_g[i-1]+ps_g[i];
temp_b[i]=temp_b[i-1]+ps_b[i];
//累计分布取整,ns_r[]、ns_g[]、ns_b[]保存有计算出来的灰度映射关系
ns_r[i]=(int)(255.0f*temp_r[i]+0.5f);
ns_g[i]=(int)(255.0f*temp_g[i]+0.5f);
ns_b[i]=(int)(255.0f*temp_b[i]+0.5f);
}
最后按照计算出来的映射关系把原图的原始灰度值映射到经过均衡化的新灰度级上,完成最后的处理,下图就是原图像和用本程序得出的经过直方图均衡化处理的目标图像,从实验结果可以看出原始图像太暗根本看不清细节,而处理过的图像则非常清晰:
for(i=54;i<m_dwFileLen;i++)
{
m_cpBuffer[i]=ns_r[m_cpBuffer[i]]; //对R分量进行灰度映射(均衡化)
i++;
m_cpBuffer[i]=ns_g[m_cpBuffer[i]]; //对G分量进行灰度映射(均衡化)
i++;
m_cpBuffer[i]=ns_b[m_cpBuffer[i]]; //对B分量进行灰度映射(均衡化)
}
采取单映射规则的直方图规定化处理
更多精彩
赞助商链接