数字图像处理——第三章 空间域图像增强(灰度变换和直方图处理)

空间域图像增强

图像增强是图像处理中最具吸引力的领域之一,增强处理的首要目标是处理图像,对图像进行加工,使其比原始图像更适合特定的应用。空间域是指图像平面本身,这类图像处理方法直接操作图像中的像素,其在计算上相比于频率域变换更有效,且执行所需的处理资源较少。

空间域处理分为灰度变换和空间滤波两种。灰度变换是对图像的单个像素进行操作,主要以对比度和阈值处理为目的。空间滤波涉及改善性能的操作,如通过图像中每个像素的邻域处理来锐化图像。

1. 背景知识

空间域处理可由下式定义:g(x, y) = T[f(x, y)]。(T是对f的一种操作,定义在(x, y)的邻域,另外T能对输入图像集进行操作)。

邻域通常是中心在(x, y)的矩形,有时也采用其他形状,如圆的数字近似,但矩形邻域是到目前为止最好的邻域,因为它在计算机上实现起来更容易。

T操作最简单的形式是邻域为1×1的尺度(即单个像素),在这种情况下,g仅仅依赖于f在(x, y)点的值,T操作成为灰度级变换函数(也叫作强度映射),形式为:s = T( r)。其中s和r为所定义的变量,分别是g和f在任意点(x, y)的灰度值。

灰度变换是所有图像处理技术中最简单的技术。r和s分别表示处理前后的像素值,这些值与s = T( r)表达式的形式有关。其中T是把像素值r映射到像素值s的一种变换。

2. 基本灰度变换

2.1 图像反转

灰度级范围为[0, L - 1]的图像反转可以由反比变换得到,表达式为:

在这里插入图片描述
用这种方式倒转图像的强度产生图像反转的对等图像。这种处理尤其适用于增强嵌入于图像暗色区域的白色或灰色细节,特别是当黑色面积占主导地位时。

2.2 对数变换

对数变换的通用形式为:


其中c是一个常数,并假设r ≥ 0。该变换将输入中范围较窄的低灰度值映射为输出范围中较宽的灰度值,或将输入中范围较宽的高灰度值映射为输出范围中较窄的灰度值。

我们使用这种类型的变换来扩展图像中的暗像素值,同时压缩更高灰度级的值。 反对数变换的作用与此相反。

注:如果原图像的灰度级为L,对数变换公式的结果应当重新标定为[0, L - 1]的灰度级。

例如对于一幅256灰度级的原图像,对数变换增强的结果可以用下式表示:

在这里插入图片描述
该公式说明了在对数变换曲线中隐含的步骤。

2.3 幂次变换

幂次变换的基本形式为:

在这里插入图片描述
其中c和γ为正常数。与对数函数情况类似,部分γ值的幂次曲线将较窄范围的暗色输入值映射为较宽范围的输出值,或将较宽范围的高灰度级输入值映射为较窄范围的输出值。

但对于不同的γ,曲线形式不同:
(1)当γ < 1时,其曲线形式和对数曲线相似。
(2)当γ > 1时,作用相反,高灰度区扩展,低灰度区压缩。

2.4 分段线性变换函数

分段线性变换函数的主要优势在于可以任意合成,但需要更多的用户输入。

2.4.1 对比拉伸

对比拉伸是最简单的分段线性变换函数,用以提高图像灰度级的动态范围。

2.4.2 灰度切割

在图像中提高特定灰度范围的亮度通常是必要的,也被称为灰度切割。

有许多方法可以进行灰度切割,但他们中的大多数是两种基本方法的变形。其一是在所关心的范围内为所有灰度指定一个较高值,而为其他灰度指定一个较低值。第二种方法使所需范围的灰度变亮,但是仍保持了图像的背景和灰度色调。

2.4.3 位图切割

代替提高灰度范围的亮度,而通过对特定比特提高亮度,对整幅图像质量仍然是有贡献的。

3. 基本灰度变换函数

3.1 函数imadjust和stretchlim

函数imadjust是一个基本的图像处理工具箱函数,用于对灰度级图像进行灰度变换,该函数的一般语法格式为:

g = imadjust(f, [low_in high_in], [low_out high_out], gamma)

该函数将图像f中的灰度值映射为g中的新值。
  • 函数imadjust,除了f和gamma,其所有输入值都被限定在0和1之间。
  • 若[low_in high_in]或[low_out high_out]使用[ ],则得到默认值[0 1]。
  • 若low_out大于high_out,那么输出灰度将被反转。
  • 若gamma值小于1,则映射被加权至较高的输出;若gamma值大于1,则映射被加权至较低的输出。
  • 若gamma缺省,则默认为1。

同时,我们用到函数stretchlim,能够自动的使用imadjust而不必考虑高参数和低参数的问题,其基本语法如下:

Low_High = stretchlim(f)

其中Low_High是一个两元素向量,用于实现对比度拉伸。默认情况下Low_High中的值指定灰度级,这些灰度级充满f中底部和顶部1%的所有像素值。
具体使用实验如下:
>> f = imread('C:\Users\86158\Desktop\taiyuan.png');
>> g = rgb2gray(f);
>> g1 = imadjust(g, [0 1], [1 0]);
>> g2 = imadjust(g, [0.5 0.75], [0 1]);
>> g3 = imadjust(g, [], [], 2);
>> g4 = imadjust(g, stretchlim(g), []);
>> g5 = imadjust(g, stretchlim(g), [1 0]);

我们得到了如下运行结果:
在这里插入图片描述

图1 函数imadjust和stretchlim的实验结果

如图1-1所示,使用rgb2gray将一幅彩色图像变换为我们实验所需的灰度图。
如图1-2所示,使用imadjust将图像灰度从[0 1]映射到了[1 0],实现了图像的明暗反转,得到负片图像。尽管事实上与原图相比两幅图在视觉内容上是一样的,但是在负片图像这种特殊情况下,我们观察具体的细节结构要比原灰度图容易的多。同样的效果也可以使用工具箱函数imcomplement得到。
如图1-3所示,使用imadjust将0.5到0.75之间的灰度扩展到整个[0 1]范围,利用这种对比度拉伸方法可以强调感兴趣的灰度区。
如图1-4所示,对[low_in high_in]或[low_out high_out]使用[ ]、gamma指定为2来压缩灰度级的低端扩展高端,将较亮的部分映射为更暗的输出,得到与图1-3类似的结果,但增加了许多灰度值。
如图1-5所示,使用默认情况下的stretchlim函数,和原图像相比对比度有所提升,可以观察到一些细节。
如图1-6所示,增强了负片图像的对比度,得到了比负片效果更加明显的细节效果。

3.2 函数im2uint8

在执行对数变换时,希望使得压缩值出现在完整的显示范围内,可以使用im2uint8将会把值限定在[0, 1]范围内的二值图像转变为限定值为[0, 255]内的uint8类。最简单的方法是使用语句:

>> gs = im2uint8(mat2gray(s));

具体实验如下:

在这里插入图片描述

图2 函数im2uint8的实验结果

如图2所示,使用函数im2uint8对二值图进行处理,命令为:
>> s = imread('C:\Users\86158\Desktop\sample.jpg');
>> imshow(s);
>> s2 = im2uint8(mat2gray(log(1 + double(s))));
>> imshow(s2);

通过两张图对比可以发现,图像将较窄的范围映射到了较宽的范围,视觉效果得到很大提升,能够观察到许多原图像丢失的细节。

4. 直方图处理

直方图是多种空间域处理技术的基础。
灰度级为[0, L - 1]范围的数字图像的直方图是离散函数h(rk) = nk,这里rk是第k级灰度,nk是图像中灰度级为rk的像素个数。经常以图像中像素的总数(用n表示)来除它的每一个值得到归一化的直方图。因此,一个归一化的直方图由P(rk)=nk/n给出,这里k=0, 1, …, L - 1。 简单的说,P(rk)给出了灰度级为rk发生的概率估计值。
归一化直方图所有分量之和应等于1。

灰度直方图具有如下特征:

  • 直方图仅能描述图像中每个灰度级具有的像素个数,不能表示图像中每个像素的位置信息;
  • 任一特定的图像都有唯一的直方图,不同的图像可以具有相同的直方图;
  • 如果一幅图像由两个不连接的区域组成,则整幅图像的直方图等于两个不连接的区域的直方图之和;
  • 直方图的形态与正态分布的曲线形态类似。

4.1 生成并绘制图像直方图

MATLAB工具箱中有一个处理图像直方图的核心函数imhist,其基本语法是:

h = imhist(f, b)

其中,f为输入图像,h为其直方图,b是用来形成直方图的“容器”数目(若b未包含在此参量中,则其默认值为256)。一个“容器”仅是灰度范围的一小部分。

例如,如果正在处理一幅uint8类的图像且令b=2,则灰度范围被分成两部分:0至127和128至255。所得的直方图将有两个值:h(1),等于图像中其值在区间[0, 127]内的像素数;h(2),等于图像中其值在区间[128, 255]内的像素数。使用如下表达式,可以得到归一化直方图:

p = imhist(f, b) / numel(f)

如下图为利用没有规定输出的函数imhist绘制的直方图,其语句为:
imhist(g);

在这里插入图片描述

图3 在工具箱利用默认值得出的直方图


然而,绘制直方图还有许多其他方法,如bar,stem和plot等。

使用函数:bar(horz, z, width)可将直方图利用条形图来绘制。其中z是一个包含将被绘制的点的行向量;horz是一个与z同维数的向量,它包含了水平刻度的增量;width是一个介于0和1之间的数。换句话说:horz的值给出了水平增量,而z的值是相应的垂直值。若horz被省略,水平轴会从0至length(z)等分为若干单位。当width的值为1时,竖条较明显;当width的值为0时,竖条是垂直线。width的默认值为0.8。

绘制条形图时,通常会通过将水平轴等分位几段来降低其分辨率。使用bar函数的语句及效果图如下:

>> h = imhist(g, 25);
>> horz = linspace(0, 255, 25);
>> bar(horz, h);

在这里插入图片描述

图4 利用bar函数绘制的条形图

通过观察对比可以看出,条形图的垂直刻度跨越了更宽的范围,因为每个条形图的高度是由一个范围的所有像素决定的,而不是由单一值的所有像素决定的。

杆状图与条形图相似,其基本语法为:stem(horz, z, ‘LineSpec’, ‘fill’)。其中z是一个包含了将被绘制的点的行向量,horz与函数bar中的说明相同,参量LineSpec来自一个三值组。详细的参数表格见《数字图像处理(MATLAB版)》P35。fill为标记点用三值组中的第一个元素指定的颜色来填充。使用stem函数的语句及效果图如下:

>> h = imhist(g, 25);
>> horz = linspace(0, 255, 255);
>> stem(horz, h, 'fill')

在这里插入图片描述

图5 利用stem函数绘制的杆状图

函数plot是将一组点用直线连接起来,其语法为:plot(horz, z, ‘LineSpec’)。其中各参数的定义同杆状图。利用函数plot绘制直方图的语法及图像如下图所示:

>> h = imhist(g, 25);
>> plot(h)

在这里插入图片描述

图6 利用plot函数绘制的直方图

使用stem函数和plot函数的明显区别在于:stem绘制的是离散图像,而plot绘制的是连续图像。函数plot经常用语显示变换函数。

4.2 直方图均衡化

4.2.1 直方图均衡

直方图均衡化:通过原始图像灰度的非线性变换,使其直方图变成均匀分布,以增加图像灰度值的动态范围,从而达到增强图像整体对比度、使图像变清晰的效果。

直方图均衡化的目的:寻找变换函数,该函数产生有均匀直方图的输出图像。也就是得到一幅灰度级丰富且动态范围大的图像。该函数仅仅依靠输入图像直方图中的信息就可以自动达到这一效果。

直方图均衡化的特点:

  1. 图像均衡化处理后,图像的直方图是平直的,即各灰度级具有相同的出现频数,那么由于灰度级具有均匀的概率分布,图像看起来就更清晰了。
  2. 直方图均衡化实质上是减少图像的灰度级以换取对比度的加大。
  3. 在均衡过程中,原来的直方图上频数较小的灰度级被归入很少几个或一个灰度级内,故得不到增强。
  4. 若这些灰度级所构成的图像细节比较重要,则需要采用局部区域直方图均衡。

考虑连续函数并且让变量r代表待增强图像的灰度级。假设r被归一化到区间[0, L - 1],且r=0表示黑色及r=L - 1表示白色。对于任一满足上述条件的r,我们将注意力集中在变换形式上:

s = T(s) 0 ≤ r ≤ L - 1
假设变换函数T(r)满足以下条件:
  1. T( r)在区间0 ≤ r ≤ L - 1中为单值且单调递增
  2. 当0 ≤ r ≤ L - 1时,0 ≤ T( r) ≤ L - 1

满足这些条件是为了保证原始图像不会变性,保持原始图像灰度级高的地方仍然高,低的仍然低;同时输出图像灰度值的变化范围与原始图像的灰度值变化范围是一样的。

那么现在的问题就是求函数T,使结果图像的直方图均匀分布。一幅图像的灰度级可视为区间[0, L - 1]内的随机变量。随机变量的基本描绘是其概率密度函数。令Pr( r)和Ps(s)分别表示随机变量r和s的概率密度函数。由基本概率论得到的基本结果是,若Pr( r)和T( r)已知,且在感兴趣的值域上T( r)是连续且可微的,则变换(映射)后的变量s的PDF可由下式得到:
在这里插入图片描述
这样,输出灰度变量s的PDF就由输入灰度的PDF和所用的变换函数决定。在图像处理中,就使用如下的变换函数得到想要的函数T。
在这里插入图片描述
对于离散值,处理概率与和,而不是概率密度与积分。一幅图像中的灰度级rk出现的概率近似为:
在这里插入图片描述
其中MN为图像的总像素,nk为灰度为rk的像素个数,由此可以得到变换的离散形式为:
在这里插入图片描述
需要注意的是:上式中的rk和sk都是归一化后的值,并且在实际的应用中,输入和输出的数字图像的灰度级应该是一致的,如对一幅256个灰度级的数字图像进行直方图均衡,结果图像应该也是256灰度级的。

这样,已处理的图像将输入图像中灰度为rk的各像素映射到输出图像中灰度级为sk的对应像素。在这个公式中,变换T(rk)称为直方图均衡或直方图线性变换。

与连续形式不同,一般不能证明离散变换能产生均匀概率密度函数的离散值。
直方图均衡化具有完全“自动化”的特点。可以直接使用从已知图像提取的信息,而不需要更多的参数说明。
计算简单性也是直方图均衡化的一个优点。

4.2.2 histeq函数

直方图均衡由工具箱中的函数histeq实现,其语法为:g = histeq(f, nlev)
其中f为输入图像,nlev是为输出图像设定的灰度级数,与imhist不同,默认值为64。

  • 若nlev与L(输入图像中可能的灰度级总数)相等,则histeq直接执行变换函数。
  • 若nlev小于L,则histeq试图分配灰度级,以便得到近似平坦的直方图。

在很大程度上,将nlev赋值为灰度级最大可能数量(通常为256),因为这样能够利用直方图均衡方法得到较为正确的直方图结果。

使用函数histeq完成直方图均衡化,语句如下:

>>imshow(f)
>>figure, imhist(f)
>>g = histeq(f, 256)
>>figure, imshow(g)
>>figure, imhist(g)

得到的结果如下图所示:
在这里插入图片描述

图7 直方图均衡化实例


从上图中可以看出,直方图均衡化后,在平均灰度及对比度方面的改进是非常明显的。对比度增加源于直方图在整个灰度级上的显著扩展。灰度级增加源于均衡化后的图像直方图中灰度级的平均值高于原始值,虽然并不能生成一个平坦的直方图,但它具有能增加图像灰度级的动态范围的特性。

4.3 直方图匹配(规定化)

直方图均衡生成了自适应的变换函数,从这个意义上说,它是以给定图像的直方图为基础的。然而一旦对一幅图像的变换函数计算完毕,它将不再改变,除非直方图有改变。但这种方法在某些应用上并不是最好的方法。特别是,能够规定处理后的图像的直方图形状在某些应用中十分有用。这种生成特定直方图的图像的方法,称为直方图匹配或直方图规定化。

实现直方图匹配的工具箱函数histeq的语法如下:g = histeq(f, hspec)。
其中f为输入图像,hspec为规定的直方图(一个规定值的行向量),g为输出图像,输出图像的直方图近似于指定的直方图hspec。该向量包含有对应于等分容器的整数计数值。histeq的特性是当length比图像f中的灰度级数小很多时,图像g的直方图通常会较好的匹配hspec。

在使用了直方图规定化后,会保持原有直方图的基本形状,但会出现更平滑的过渡。在使用直方图均衡化得到的结果的基础上,直方图规定化图像的改进会使图像外观得到明显改进,是一种直接的处理。然而,一般来说,并没有规定直方图的规则,对于任何给定的增强任务,都要借助于实际分析。

4.4 局部直方图处理

有时对图像小区域细节的局部增强也可以使用直方图处理。局部增强的解决方法就是在图像中每一个像素的邻域中,根据灰度级分布(或其他特性)设变换函数。

直方图处理技术很容易适应局部增强,该过程定义一个方形或矩形的邻域并把该区域的中心从一个像素移至另一个像素,在每一个位置的邻域中该点的直方图都要被计算,并且得到的不是直方图均衡化就是规定化的变换函数。这个函数最终被用来映射邻域中心像素的灰度。

5. 总结

灰度变换和直方图处理都是对图像像素进行处理,来达到处理对比度和图像阈值,最终实现图像增强的目的。在使用灰度变换时,当我们需要增强嵌入图像的暗色区域中的白色或灰色区域,即黑色部分占主导的图像时,选用图像反转;若图像像素值的动态范围较大,使用对数变换完成对图像灰度级的扩展和压缩;若我们考虑的实际实现需要分段函数来表达,那就需要选择分段线性变换函数来实现图像的增强。

作为灰度变换的直方图处理,描述了图像中灰度分布情况,能够很直观的展示出图像中各个灰度级所占的多少。假如图像的灰度分布不均匀,其灰度分布集中在较窄的范围内,使图像的细节不够清晰,对比度较低。通常采用直方图均衡化及直方图规定化两种变换,使图像的灰度范围拉开或使灰度均匀分布,从而增大反差,使图像细节清晰,以达到增强的目的。

直方图均衡化,对图像进行非线性拉伸,重新分配图像的灰度值,使一定范围内图像的灰度值大致相等。这样,原来直方图中间的峰值部分对比度得到增强,而两侧的谷底部分对比度降低,输出图像的直方图是一个较为平坦的直方图。直方图的均衡化实际也是一种灰度的变换过程,将当前的灰度分布通过一个变换函数,变换为范围更宽、灰度分布更均匀的图像,也就是将原图像的直方图修改为在整个灰度区间内大致均匀分布。因此扩大了图像的动态范围,增强图像的对比度。通常均衡化选择的变换函数是灰度的累积概率。

直方图的均衡化自动的确定了变换函数,可以很方便的得到变换后的图像,但是在有些应用中这种自动的增强并不是最好的方法。有时候,需要图像具有某一特定的直方图形状(也就是灰度分布),而不是均匀分布的直方图,这时候可以使用直方图规定化。

直方图规定化,也叫做直方图匹配,用于将图像变换为某一特定的灰度分布,也就是其目的的灰度直方图是已知的。这其实和均衡化很类似,均衡化后的灰度直方图也是已知的,是一个均匀分布的直方图;而规定化后的直方图可以随意的指定,也就是在执行规定化操作时,首先要知道变换后的灰度直方图,这样才能确定变换函数。规定化操作能够有目的的增强某个灰度区间,相比于,均衡化操作,规定化多了一个输入,但是其变换后的结果也更灵活。

猜你喜欢

转载自blog.csdn.net/weixin_42262128/article/details/106471630