AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > VC编程

直方图变换图像处理技术

51自学网 2015-08-30 http://www.wanshiok.com

 

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

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
{

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)的映射关系后,按照该映射关系把原图的原始灰度值映射到经过均衡化的新灰度级上,以完成最后的处理。上图(图3)为实验得到的按单映射规则对直方图规定化后的效果,同直方图均衡化处理效果相比,可以看出高亮度部分得到了充分的增强。

组映射规则的直方图规定化处理

单映射规则虽然实现起来比较简单直观,但在实际处理时仍存在不可忽视的取整误差,因此在一定程度上还不能很好的实现规定直方图的意图。可以通过在规定化直方图时选取适当的对应规则来改善,一种比较好的对应规则是组映射规则(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
{

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分量的处理类似,在此省略

……

}

对原始图像应用本算法,实验得出的按组映射规则对原图做直方图规定化后的效果如图4所示。

该图同单映射规则处理图像相比虽无太大变化,但在直方图分布和图像细节上更能体现出规定直方图的意图,而且通过下面的分析也可以看出组映射规则的误差要小得多。

在ps(si)映射到pu(uj)时,采取SML规则的映射方法由于取整误差的影响可能产生的最大误差是pu(uj)/2,而采用GML规则的映射方法可能出现的误差为ps(si)/2,由于M≥N,所以一定有pu(uj)/2≥ps(si)/2成立,也就是说SML映射规则的期望误差一定不会小于GML映射规则的期望误差。而且从算法实现上也可以看出,SML映射规则是一种有偏的映射规则,某些范围的灰度级会被有偏地映射到接近开始计算的灰度级;而GML映射规则是统计无偏的,从根本上避免了上述问题的出现。通过分析可以看出GML映射规则总会比SML映射规则更能体现规定直方图的意图,而且通常产生的误差只有SML映射规则的十几分之一。

结论

本文从理论上讲述了直方图变换处理中常用的直方图均衡化、采取单映射和组映射规则的直方图规定化变换方法,通过程序算法实现了上述图像增强过程,并给出了通过三种算法实验得出的处理图像。实验表明,本文介绍的方法对于暗、弱信号的原始图像的目标识别和图像增强等有着良好的处理效果,尤其是通过组映射规则的直方图规定化变换方法结合设计良好的规定直方图,可以得到更佳的图像处理效果。本文给出的程序代码在Microsoft Visual C++ 6.0下编译通过。

 
 
说明
:本教程来源互联网或网友上传或出版商,仅为学习研究或媒体推广,wanshiok.com不保证资料的完整性。

上一篇:Linux下C语言编程基础知识  下一篇:碎片图像无缝拼合技术的VC++实现