VC下通过直方图变换对图像进行有效增强(2)

2008-04-09 04:10:39来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折


 i ;
 m_cpBuffer[i]=ns_g[m_cpBuffer[i]]; //对G分量进行灰度映射(均衡化)
 i ;
 m_cpBuffer[i]=ns_b[m_cpBuffer[i]]; //对B分量进行灰度映射(均衡化)
}
  采取单映射规则的直方图规定化处理

  前面介绍的直方图均衡化处理方法从实验效果看还是很不错的,从实现算法上也可以看出其优点主要在于能自动增强整幅图像的对比度,但具体的增强效果也因此不易控制,只能得到全局均衡化处理的直方图。而在科研和工程应用中往往根据不同的需要而希望得到特定形状的直方图分布以有选择的对某灰度范围进行局部的对比度增强。象这种情况可以采取对直方图的规定化处理,通过选择合适的规定化函数可以取得期望的效果。对于灰度级数分别为M和N(满足M≥N)的原始图和规定图,一般仍先按均衡化对原始图进行处理:

tk = EHs(si) = ∑ps(si) ,(k=0,1,2,……,M-1)
  然后规定需要的直方图,并计算出能使规定的直方图均衡化的变换:

vl = EHu(uj) = ∑pu(ui) ,(l=0,1,2,……,N-1)
  最后将第一步得到的变换反转过去,即把原始直方图对应映射到规定的直方图,也就是把所有的ps(si)映射到pu(uj)中去。由于映射是在离散空间进行的,而且在取整时不可避免会引入误差,因此采取何种对应规则是一个很重要的问题。比较常用的一种方法是Gonzalez在1987年提出的单映射规则(single mapping law,SML):首先寻找能满足 |∑ps(si) - ∑pu(uj)| 最小的k和l(ps()和pu()的求和上限),然后把ps(si)映射到pu(uj)中去。

点击放大此图片

  本文针对原始图像比较暗的特点,采取如下的规定直方图,以使高亮度像素能得到充分的加强:

float a=1.0f/(32.0f*63.0f); //64个灰度级,a为步长
for(int i=0;i<64;i )
{
 nu[i]=i*4;
 pu[i]=a*i;
}
  接下来的对原始图和规定直方图计算累计直方图同前面的直方图均衡化基本一样,在此不在赘述。重点是根据SML规则把ps(si)映射到pu(uj)中去:

for(i=0;i<256;i )
{
 ……
 for(int j=0;j<64;j )
 {
  float now_value=0.0f;
  //计算R分量的两累计直方图的绝对差值,并找到满足最小的灰度级
  if(ps_r[i]-pu[j]>=0.0f)
   now_value=ps_r[i]-pu[j];
  else
   now_value=pu[j]-ps_r[i];
  if(now_value<min_value_r)
  {
   m_r=j;
   min_value_r=now_value;
  }
  ……
  //对G和B分量的代码与R分量类似,在此省略
  ……
 }
 //建立灰度映射关系
 ns_r[i]=nu[m_r];
 ns_g[i]=nu[m_g];
 ns_b[i]=nu[m_b];
}


  在得到ps(si)到pu(uj)的映射关系后按照该映射关系把原图的原始灰度值映射到经过均衡化的新灰度级上,完成最后的处理。上图为实验得到的按单映射规则对直方图规定化后的效果,同直方图均衡化处理效果相比可以看出高亮度部分得到了充分的增强。
  采取组映射规则的直方图规定化处理

  单映射规则虽然实现起来比较简单直观,但在实际处理时仍存在不可忽视的取整误差,因此在一定程度上还不能很好的实现规定直方图的意图。可以通过在规定化直方图时选取适当的对应规则来改善,一种比较好的对应规则是组映射规则(group mapping law,GML)。这种规则的约定如下:

  存在一维离散整数函数I(a),(a=0,1,2……N-1),而且满足0≤I(0) ≤I(1) ≤……≤I(a) ≤……≤I(N-1) ≤M-1。寻找能使 |∑ps(si) - ∑pu(uj)| 达到最小的I(a),其中ps(si)的求和区间为[0,I(a)];pu(uj)的求和区间仍为[0,a]。a=0时将介于0和I(0)之间的ps(si)都映射到pu(u0)中;1≤a≤N-1时,将介于I(a-1) 1和I(a)之间的ps(si)都映射到pu(uj)中去。

  由于同单映射规则相比只是对应规则作了变化,因此编码部分只需将对应规则部分的代码根据上面介绍的组映射规则做必要修改即可:

for(i=0;i<64;i ) //对规定直方图的灰度级进行枚举
{
 ……
 for(int j=0;j<256;j ) //对原图的灰度级进行枚举
 {
  float now_value=0.0f;
  //寻找对于R变量能满足差值最小的I(a),保存于A2_r
  if(ps_r[j]-pu[i]>=0.0f)
   now_value=ps_r[j]-pu[i];
  else
   now_value=pu[i]-ps_r[j];
   if(now_value<min_value_r)
   {
    A2_r=j;
    min_value_r=now_value;
   }
   for(int k=A1_r;k<=A2_r;k )//建立R分量的映射规则
    ns_r[k]=nu[i];
    A1_r=A2_r 1;
    ……
    //对于G、B分量的处理与上类似,在此省略。
   ……
}
  对原始图像应用本算法,实验得出的按组映射规则对原图做直方图规定化后的效果图如下图所示:

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:编程技巧 Dot.net的安全机制

下一篇:VC 6.0在灰度数字图像增强处理中的应用