您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > VC++6.0在灰度数字图像增强处理中的应用
VC++6.0在灰度数字图像增强处理中的应用2008-07-1221:45用直方图均衡化对灰度图像进行灰度映射,可以达到使图像增强的目的。VC++6.0执行效率高,可继承、封装、移植,对直方图均衡化算法进行实现。由于噪声、光照等外界环境或设备本身的原因,通常我们所获取的原始数字图像质量不是很高,因此在对图像进行边缘检测、图像分割等操作之前,一般都需要对原始数字图像进行增强处理。图像增强主要有两方面应用,一方面是改善图像的视觉效果,另一方面也能提高边缘检测或图像分割的质量,突出图像的特征,便于计算机更有效地对图像进行识别和分析。图像增强是图像处理最关键的研究问题之一,图像增强按作用域可分为两类,即空域处理和频域处理。空域处理是直接对图像进行处理,而频域处理则是在图像的某个变化域内,对图像的变换系数进行运算,然后通过逆变换获得图像增强效果。频域处理技术较难,涉及较多的数学知识和建模方法,所以先主要对空域增强法中的直方图均衡进行分析并用VC++6.0进行算法实现。当前图像处理在算法实现中主要应用Matlab仿真工具,但Matlab运行效率较低,且可移植性和实用性均不太理想。与Java和C#等其他高级语言相比,VC++在程序运行效率、内存使用的可控性和编程的灵活性上均具有绝对的优势,因此我采用VC++6.0集成开发环境。灰度图像直方图均衡化的描述1、灰度图像直方图处理方法图像的直方图是图像处理中一种十分重要且实用的工具,它概括了一副图像的灰度级内容。从数学上来说图像直方图是图像各灰度值统计特性与图像灰度值的函数,它统计一幅图像中各个灰度级出现的次数或概率。实际上,灰度图像直方图是一个离散函数:pf(fk)=nk/nk=0,1,…,L-1其中fk为图像f(x,y)的第k级灰度,nk是图像f(x,y)中具有灰度值fk的象素个数,n是图像象素总数,L是图像的灰度级数。因为pf(fk)给出了对各个fk出现概率的一个统计,所以直方图提供了图像的灰度值分布情况。在灰度直方图坐标系中,横坐标表示图像中各个像素点的灰度级,纵坐标为各个灰度级上图像各个像素点出现的次数或概率。在对灰度数字图像的增强处理方法中,灰度均衡化和灰度规定化应用较为广泛,但后者需要根据具体的图像人为规定好适当的期望直方图才能得到满意的效果,如果期望直方图规定不当则处理效果会很差,因此后者的通用性不好。而前者在处理时只需要将当前的灰度分布重新均衡地分布于整个灰度区间即可,虽然对于某一幅特定的图象处理效果可能不及灰度规定化,但通用性却要好的多,对任意图象均可获得相当不错的处理效果。2、灰度图像直方图均衡化算法分析直方图均衡化的基本思想是把原始图的直方图变换为均匀分布的形式,这样就增加了象素灰度值的动态范围从而可达到增强图像整体对比度的效果。设原始图像在(x,y)处的灰度为f,而改变后的图像为g,则对图像增强的方法可表述为将在(x,y)处的灰度f映射为g。在灰度直方图均衡化处理中对图像的映射函数可定义为:g=EQ(f),这个映射函数EQ(f)必须满足两个条件(其中L为图像的灰度级数):(1)EQ(f)在0≤f≤L-1范围内是一个单值单增函数。这是为了保证增强处理没有打乱原始图像的灰度排列次序,原图各灰度级在变换后仍保持从黑到白(或从白到黑)的排列。(2)对于0≤f≤L-1有0≤g≤L-1,这个条件保证了变换前后灰度值动态范围的一致性。累计分布函数(cumulativedistributionfunction,CDF)即可以满足上述两个条件,并且通过该函数可以完成将原图像f的分布转换成g的均匀分布。此时的直方图均衡化映射函数为:gk=EQ(fk)=(ni/n)=pf(fi),(k=0,1,2,……,L-1)上述求和区间为0到k,根据该方程可以由源图像的各像素灰度值直接得到直方图均衡化后各像素的灰度值。在实际处理变换时,一般先对原始图像的灰度情况进行统计分析,并计算出原始直方图分布,然后根据计算出的累计直方图分布求出fk到gk的灰度映射关系。在重复上述步骤得到源图像所有灰度级到目标图像灰度级的映射关系后,按照这个映射关系对源图像各点像素进行灰度转换,即可完成对源图的直方图均衡化。算法的实现利用VC++实现的灰度图像均衡化处理的流程如下:根据上述的算法描述,要实现灰度图像的直方图均衡化必须首先统计原图像的各级灰度值,在程序中定义了一个数组lDegreeCount[256]来统计原图像的各级灰度值,然后对得到的灰度值做灰度映射,将映射后的结果存到一个新的灰度映射关系数组bMaptable[256]中,根据这个数组就可以确定出源图象的某个灰度级经过变换后对应于哪个新的灰度级,最后将变换后的结果保存到DIB中。经过这样的处理后,就可把源图像中密集分布的灰度值映射到经过均衡化后的新灰度级上,增加了对比度,改善了视觉效果。实现直方图均衡化的函数主要代码如下:BOOLWINAPIEqualize(LPSTRlpDIBs,LONGlWidth,LONGlHeight){unsignedchar*lpSource;//指向源图像的指针LONGlTmp;//临时变量LONGt,s;//循环变量BYTEbMaptable[256];//灰度映射表LONGlDegreeCount[256];//灰度计数表LONGlLineBytes;//图像每行的字节数lLineBytes=WIDTHBYTES(lWidth*8);//计算图像每行的字节数//重置计数为0for(t=0;t256;t++){lDegreeCount[i]=0;}for(t=0;tlHeight;t++){for(s=0;slWidth;s++)//计算各个灰度值的计数{lpSource=(unsignedchar*)lpDIBs+lLineBytes*t+s;lDegreeCount[*(lpSource)]++;//该灰度值的计数加1}}for(t=0;t256;t++)//计算灰度映射表{lTmp=0;//初始为0for(s=0;sj=t;s++){lTmp+=lDegreeCount[s];}bMaptable[t]=(BYTE)(lTmp*255/lHeight/lWidth);//计算灰度值新的映射表}for(t=0;tlHeight;t++)//每行{for(s=0;slWidth;s++)//每列{//指向DIB第i行,第j个象素的指针lpSource=(unsignedchar*)lpDIBs+lLineBytes*(lHeight-1-t)+s;*lpSource=bMaptable[*lpSource];//根据映射表计算新的灰度值}}returnTRUE;}在程序中把打开图像、初始化DIB对象并获取指向DIB对象的指针、获取DIB对象的宽度和高度等操作放到视图类中,并将指向图像DIB象素的指针lpDIBs、图像的高DIBWidth(lpDIB)、宽DIBHeight(lpDIB)作为参数传递给Equalize()函数,这种方法能使程序的封装性和可移植性更好,体现了面向对象编程技术的优越性。实验结果原始Lena图像与均衡化后的Lena图像的直方图和图像效果对比如下(图1-图4)。图中可以看出,原始Lena图像的灰度主要分布在中高灰度级上,在低灰度级上图像的像素数几乎为零。经过直方图均衡化处理后图像变的清晰了,处理后的LENA图像直方图分布更均匀,在每个灰度级上都有像素点。结论由于图像处理需要处理大量的图像数据,经常使用复杂、费时的算法,因此图像处理程序的效率非常重要。较之Matlab、Java、C#等其他语言来说,VC++为图像处理的相关操作提供了很大的方便,易于硬件实现,提高了运行效率。图1原始Lena图像图2均衡化后的Lena图像
本文标题:VC++6.0在灰度数字图像增强处理中的应用
链接地址:https://www.777doc.com/doc-2854385 .html