第二章 图象增强 (Image Enhancement) 图像增强是指对图像的某些特征,如边缘、轮廓、对比度、亮度等进行强调或尖锐化,以便于观察或进一步分析处理。其手段无非是突出有价值的信息,抑止无用信息。 图像增强的主要方法可分为:基于点运算(空域)的方法、基于邻域运算(空域)的方法、基于变换域(频域)的方法等。 点运算的方法是对像素的灰度级进行变换,是一种点到点的变换,输出图象每个象素点的灰度值仅由对应的输入象素点的灰度值决定。可描述为:G(x,y)=F(g(x,y))。其中(x,y)是象素的坐标,g(x,y)是象素(x,y)原来的灰度值,F是灰度值的变换函数, G(x,y)是象素(x,y)变换后(增强后)的灰度值。可以看出,点运算的关键是寻找合适的F,F的自变量是灰度值,与像素的坐标(x,y)没有任何关系。 邻域运算的方法是一种利用各象素及其邻近各象素的灰度值来判断该点是否含有噪声,并用适当的适当的方法消除噪声的方法。其自变量是坐标和灰度值。习惯上,将这部分内容单分一章讨论,并称之为图像平滑或图像滤波。我认为这种分法是合理的。 2002, Ver1.0 任明武,南京理工大学计算机系
2.1 线性变换和分段线性变换(linear Stretch) 基于变化域的方法属于频率域的处理方法,主要指低通和高通滤波。低通滤波用来消除噪声,高通滤波用来提升边缘、轮廓。实现过程是使用某种变换(如傅立叶变换,余弦变换、小波变换等),将图像变换到某个变换域(频域)内,对图像的变化系数值进行运算,即作某种修正,然后通过逆变换得到增强后的图像。 我们在本章中主要讲述点运算,包括: ․线性变换和分段线性变换 ․非线性变换 ․直方图均衡化 ․直方图规定化 2.1 线性变换和分段线性变换(linear Stretch) 通俗地讲,线性变换即比例变换,即因变量和自变量之间存在固定的比例系数,该系数为常数。灰度变换函数为线性函数: G=F(g)=a·g+b 当a>1时,输出图象对比度增大;当a<1时,输出图象对比度降低;当a=1,b≠0时,仅使输出图象的灰度值上移或下移,其效果是使整个图象更亮或更暗。(举例) 2002, Ver1.0 任明武,南京理工大学计算机系
设原图象的灰度变化范围为[gmin , gmax],通过一个函数F,使范围扩展到[Gmin, Gmax],则有线性变换: 一般情况下,线性变换都是将某个较小的灰度范围拉伸到较大的灰度范围。因此常称为灰度拉伸。比如,在曝光不足或过度的情况下,图像的灰度可能局限在一个很小的范围内,此时需要线性拉伸。 设原图象的灰度变化范围为[gmin , gmax],通过一个函数F,使范围扩展到[Gmin, Gmax],则有线性变换: 即通过两个点(gmin, Gmin)和(gmax, Gmax)的直线方程。例: G 的方程为: G = 50g F Gmax Gmin gmin g gmax 2002, Ver1.0 任明武,南京理工大学计算机系
观察下面方程分别实现的功能: G G 255 G F 180 255 F 255 255 g 60 255 g 分段线性拉伸是将图像区间分成两段乃至多段作线性变换。在感兴趣的区间,斜率大于1,突出有价值的信息;在不感兴趣的区域,斜率小于1 ,抑止无用信息。 2.2 非线性变换 有时图像中灰度的动态范围太大,以至于计算机的显示器难以显示出(计算机只能表述256级灰度),比如CT片在计算机的显示器上就难以显示,通常采用取对数的方法加以调整,即: 2002, Ver1.0 任明武,南京理工大学计算机系
其中,c是比例系数,式中的1和绝对值是避免对负数和0取对数。 2.3线性和非线性变换的编程 由于点运算在处理与显示中的重要性,图象处理系统都有专门的处理硬件与之对应,以便能够以视频速率实时完成操作,这样的部件称为查找表( LUT (LookUp Table))。通常图象处理系统都有成组的查找表供编程使用。在通用的计算机上,没有查找表可以直接利用,通过软件逐点处理来实现,这时查找表仅表现为一种数据结构。 因为在数字图像处理中,自变量g的值域是有限的,比如通常的灰度图像中,0<=g<=255,最多只有256种取值,因此,对于实现任意的G=F(g)而言,都可以使用查表的方法实现,具体如下: BYTE LUT[256]; BYTE *pCur,*pEnd=Img+ImgSize; for(g = 0;g < 256;g ++) LUT[g ] = F(g ); for( pCur =Img ; pCur < pEnd;) *(pCur++) = LUT[*pCur]; 如果写成如下的形式就太费时间了 for( i = 0,pCur =Img ; i < Imgsize; i ++) *(pcur++) =F(*pcur); 因为在使用LUT时,F函数仅被计算256次,而在不使用时要计算ImgSize次,当图像为512x512时,F要被计算262144次。 2002, Ver1.0 任明武,南京理工大学计算机系
图象亮度(brightness):即图象矩阵的平均值,其值越小越暗。 注1:图像的特点和LUT表的使用 图像的特点:数据量特别大,灰度值的范围非常小。因此,任意的以图像灰度为自变量的函数,都可以使用查表的方法实现。查找表实际上是一种以空间换时间的策略。 思考1:G(x,y)=F(a(x,y)-b(x,y))=|a(x,y)-b(x,y) |的使用LUT表实现。其中,a(x,y),b(x,y)分别是图像A和B中的象素(x,y)的灰度值。 BYTE LUT[511],*absLUT; absLUT=LUT+255; for(i=0;i<256;i++) absLUT[i]=absLUT[-i]=i; 注2:图像的亮度和对比度 图象亮度(brightness):即图象矩阵的平均值,其值越小越暗。 图象的对比度(contrast):即图象矩阵的均方差(标准差)。对比度越大,图像中黑白反差越明显。 2002, Ver1.0 任明武,南京理工大学计算机系
例1:通过点运算使得图像的亮度为u0和对比度为d0 解:设当前图像的亮度和对比度分别为u1和对比度为d1,则可分3步完成: 思考2:如何快速计算图像的亮度和对比度。 例1:通过点运算使得图像的亮度为u0和对比度为d0 解:设当前图像的亮度和对比度分别为u1和对比度为d1,则可分3步完成: Step.1 将图像的亮度调整为0。 G1=g-u1 可知,在调整过程中,均方差不变,仍为d1 。 Step.2 将图像的均方差调整为d0 G2=G1*d0/d1 可知,在调整过程中,均值不变,仍为0。 Step.3 将图像的均值调整为u0 。 G3=G2+u0 归纳Step.1∽3得到:G=(d0/d1) *( g-u1 ) + u0 2002, Ver1.0 任明武,南京理工大学计算机系
2.4 直方图均衡化(Histogram Equalize) 2.4.1 直方图的基本概念 直方图(histogram)是灰度级的函数,它表示图象中具有每种灰度级的象素的个数,反映图象中每种灰度出现的频率。如下图所示,灰度直方图的横坐标是灰度级,纵坐标是该灰度级出现的频率,是图象的最基本的统计特征。 2002, Ver1.0 任明武,南京理工大学计算机系
从概率的观点来理解,灰度出现的频率可看作其出现的概率,这样直方图就对应于概率密度函数(pdf (probability density function))p(r),而概率分布P(r)函数就是直方图的累积和,即概率密度函数的积分,如右图所示: 2002, Ver1.0 任明武,南京理工大学计算机系
若直接从代表每种灰度r的象素数目的直方图H(r)来观察,常有如下的表示: 象素分布函数 图像面积 概率密度 概率分布函数 若记图像中象素的总数为n, 灰度为rk的像素总数为nk ,则有: 2002, Ver1.0 任明武,南京理工大学计算机系
Step.1 初始化 hist[k]=0 ; k=0,…,L-1 直方图的计算是很简单的,依据定义,若图象具有L(通常L=256,即8位灰度级)级灰度,则大小为MxN的灰度图象f(x,y)的灰度直方图hist[0…L-1]可用如下计算获得: Step.1 初始化 hist[k]=0 ; k=0,…,L-1 Step.2 统计 hist[g(x,y)]++ ; x, y =0,…,M-1, 0,…,N-1 unsigned long hist[256]; unsigned char *pCur; for(int i=0;i<256;i++) hist[i]=0; for(i=0,pCur=Img;i<ImgSize;i++) hist[*(pCur++)]++; 直方图具有很多的优点,直方图能反映图象的概貌,比如图像中有几类目标,目标和背景的分布如何;通过直方图可以直接计算图像中的最大亮度、最小亮度、平均亮度、对比度以及中间亮度等。使用直方图可以完成图像分割、目标检索等。因为不同的目标具有不同的颜色分布。使用归一化直方图作目标匹配,还不易受到目标翻转和目标大小变化的影响。在图像查询的系统中,直方图有很大的应用,用它存储目标的特征占有空间小,且执行速度快。 其缺点是:因其没有记录位置信息,不同的图像会具有相同或相近的直方图。 2002, Ver1.0 任明武,南京理工大学计算机系
例1:观察下面那个直方图最可能是一个文档图像的直方图 例2:通过直方图求图像中的亮度的最大、最小和中值。 (注:N个数据进行排列后得到一个有序序列A0…An-1, 其中An-1/2称为中值) for(g=0;g<256;g++) if (hist[g]) break; minGray=g; for(g=255;g>=0;g--) if (hist[g]) break; maxGray=g; for(g=sum=0;g<256;g++) { sum+=hist[g]; if (sum>=ImgSize/2) break; } medGray=g; 2002, Ver1.0 任明武,南京理工大学计算机系
for(g=sum=0;g<256;g++) sum+=g*hist[g]; brightness=1.0*sum/ImgSize; 例3:通过直方图求图像的亮度和对比度。 for(g=sum=0;g<256;g++) sum+=g*hist[g]; brightness=1.0*sum/ImgSize; for(g=sum=0;g<256;g++) sum+= (g-brightness)* (g-brightness)*hist[g]; contrast=sqrt(sum/ImgSize); 2.4.2 直方图均衡化算法 熵理论(Entropy)是信息量的度量,其定义为: 其中, pi 是符号 i 出现的概率。 在图象中, , pr 是灰度级r 出现的概率。 可以证明,当p0=p1=p2=…=p255=1/256时,H取最大值,即图象信息量最大。 2002, Ver1.0 任明武,南京理工大学计算机系
(1)多个 至一个:若有连续n个灰级的频数之和级等于A/N, 则必导致它们合并成一个灰度级。 均衡化原理:根据熵理论可知当H[0],H[1]…,H[n-1]相等时,图象信息量最大均衡化的目的是使每个Hi都相等,即把原始图的直方图变换为均匀分布的形式,这样就增加了象素值的范围,增强了图象的对比效果。 算法描述:令A0是图象面积,N是有效亮度级的个数,对于一个完全平坦的直方图来说,应该在每一个亮度级上A0/N 个象素。设g是原来的灰度级,G是变换后的灰度级,则可描述为:G=F(g)。但实际应用中,有两种情况需要考虑: (1)多个 至一个:若有连续n个灰级的频数之和级等于A/N, 则必导致它们合并成一个灰度级。 (2)一个到多个:若有某个灰级的频数是A/N的R倍,则必须将其分为R个不同的灰阶级,每一个上都是A/N。 情况(1)导致的灰度级的合并是简单的(是多到一的映射关系),但情况(2)时的分解是不容易的(是一到多的关系) ,因为确实难以判定g在图像的不同位置,到底如何分解才是最好。假设灰度级g要映射到[GL, GR]中,有 3种规则可以遵循: (1)规则1:总是将g映射为(GL+GR)/2。 (2)规则2:随机分配出[GL, GR]中的一个灰度级 。 2002, Ver1.0 任明武,南京理工大学计算机系
(3)规则3:检查该象素的近邻象素的灰度平均值u,并分配给它一个[GL, GR]中最接u的灰度级Gk 。 规则1是简单的,满足点运算的原则。规则2使用随机数(函数),执行速度慢,且含义不明显。规则3使用了邻域运算,其输出与象素的位置有关系,不是点运算。在实际应用中,一般仅使用规则1。 由此可以看出,均衡后的图像并不均衡,因为“只合并,不分解”;但拉大了反差,将拥有特别多的像素的灰度级变得与前与后的灰度级拉开了距离。比如1 [1,1],2 [2,3,4,5,6],3 [7,7]变成1 1,2 4,3 7。从而使得原灰度级为2的像素在均衡后的图像中特别显眼。 关于直方图均衡化的数学描述是很多的,下面我们给出一个简单的、易懂的描述。设变换前的图像的直方图为H1,要求变换后得到的图像的直方图为H2。如果将原始灰度级g被变成灰度级G,则必须满足: 这是非常显然的,比如考试成绩的前5名在变换后仍然为前5名;又比如,要使1班的成绩和2班的一样,则必须将1班的第五名的成绩g变成2班的第五名的成绩G,即他们俩之前都有5个人。 2002, Ver1.0 任明武,南京理工大学计算机系
在图像均衡化后,H2要求是每个灰度级上都有A0/N个象素,显然有: 从而得到G=F(r): A(r)是累积函数。得到算法如下: Step.1 计算累积函数A(r)如下: for(g=0;g<256;g++) A[g]=0; if (Hist[0]) N=1; else N=0; for(g=1,A[0]=Hist[0];g<256;g++) { A[g]=A[g-1]+Hist[g]; if (Hist[g]) N++; //统计有效的灰度级的个数 } Step.2 计算映射关系 for(g=0;g<256;g++) LUT[g]=N*A[g]/A[255]; // A0=A[255] Step.3 均衡化操作 for( i = 0,pCur =Img ; i < Imgsize; i ++) *(pCur++) = LUT(*pCur); 2002, Ver1.0 任明武,南京理工大学计算机系
for(g=0;g<256;g++) LUT[g]=(255.0/N)*N*A[g]/A0; 即 在整个计算过程中,我们使用的不是归一化直方图和归一化灰度,这样在上面的算法完成后,得到的最大灰度为N,而不是255。因此在Step.2中,需要构造线性拉伸。 Step.2 计算映射关系 for(g=0;g<256;g++) LUT[g]=(255.0/N)*N*A[g]/A0; 即 Step.2 for(g=0;g<256;g++) LUT[g]=255*A[g]/A0; 上面的算法已经是大家和很多教科书上采用的,但它没有使用规则1将g (GL +GR )/2,而是将g GR。导致与前个灰度级(GL-1)拉开了距离,而与后一个灰度级(GR+1)靠的很近。比如1 [1,1], 2 [2, 3, 4, 5,6],3 [7,7]变成1 1,2 6(4),3 7。具体算法,大家自己写。 2002, Ver1.0 任明武,南京理工大学计算机系
f 例: 新灰度区间[GL,GR] 灰度级g 4/7 1/7 1/14 1/21 1 2 3 4 5 6 7 1 2 3 4 5 6 7 新灰度区间[GL,GR] 灰度级g f 1/21, 1/21, 1/21 1 [0, 0] 1 1/14, 1/14 2 [0, 0] 1/7 2 3 [0, 0] 6 1/7 6 4 [1, 1] 3 1/7 [1, 1] 4 6 5 1/7 [2, 3, 4, 5] 5 6 6 [6, 6] 1/7 7 6 7 2002, Ver1.0 任明武,南京理工大学计算机系
按规则1得到的映射关系(LUT): 拉伸后: 1 LUT[1] = 0 LUT[1] = 0 2 LUT[2] = 0 LUT[2] = 0 3 LUT[3] = 0 LUT[3] = 0 4 1 LUT[4] = 1 LUT[4] = 42 5 1 LUT[5] = 1 LUT[5] = 42 6 4 LUT[6] = 4 LUT[6] = 170 7 6 LUT[7] = 6 LUT[7] = 255 2002, Ver1.0 任明武,南京理工大学计算机系
简单地说,就是把一个图象经过灰度变化f后,使得它的直方图为Hf,即规定形状。 2.4 直方图规定化 直方图规定化是指将一幅图象通过灰度变换后,使其具有特定的直方图形式,如使图象与某一标准图象具有相同的直方图,或使图象具有某一特定函数形式的直方图。 简单地说,就是把一个图象经过灰度变化f后,使得它的直方图为Hf,即规定形状。 用途:可用来校正因亮度和传感器差异引起的变化。比如,在比较同一个场景在不同的光照条件下的得到的两幅图像之前。 算法:以均衡化为桥梁 F1: H1(g1)----------H0(s) F2: H2(g2)----------H0(v) 考虑到作为均匀分布的随机变量V和S具有完全相同的统计性质,因而从统计意义上说,它们是等同的。因而,由s=F1(g1)和v=F2(g2)和v=s,得到g2=F2-1(v)= F2-1(s)= F2-1(F1(g1)) 。 作业:对图像中的每一个像素(x,y),在其周围取MxN个象素,计算此MxN个象素的灰度值的均值U1和均方差D1,假若将均值和均方差分别变为U0和D0,则得到G(x,y)=(D0/D1)*(g(x,y)-U1)+U0。对每个象素全部执行上述操作,新得到的图像和原图像相比有何变化。 2002, Ver1.0 任明武,南京理工大学计算机系
尝试:下面两幅图像是在不同光照下得到的,使用本章中讲过的原理,对它们进行一致化。(提示:本问题可能无法解决,若能解决可写一片优秀论文;尝试一下,可知道各种方法的缺陷) 2002, Ver1.0 任明武,南京理工大学计算机系