灰度变换与空间滤波

2.1函数imadjust和stertechlim
例2.1使用函数 imadjust。
图2.3(a)是-幅数字乳房图像f,图像中显示了一处病灶,图2.3(b)是使用如下命令得到的明暗反转

g1 = imadjust(f, [0 1], [1 0]);
这种获得明暗反转图像的过程对于增强嵌入在一大片黑色区域中的白色或灰色细节是非常有用的。例如,
在图2.3 (b)中就非常容易分析乳房的组织。图像的负片同样可以利用工具箱函数imcomplement得到:
g = imcomplement(f)
图2.3 ©是使用如下命令的结果:
》> g2 = imadjust(f, [0.5 0.75], [0 1]);
该命令将0.5到0.75之间的灰度扩展到整个[0, 1]范围。这种类型的处理对于强调感兴趣灰度区非常有用。
最后,利用命令
g3 = imadjust(f,[ ],[ ], 2);
通过压缩灰度级的低端并扩展高端[见图2.3(d) ],得到类似于图2.3 ©的结果(增加了更多的灰色调)。

2.2利用对数变换减小动态范围
图2.5(a)是个取值范围在0至106间的傅里叶频谱,它显示在线性标度的8位显示系统上。图2.5(b)
显示了使用如下命令后的结果:
》> g =im2uint8(mat2gray(1og(1 + double())));
》> imshow(g)
与原始图像相比,图像g在视觉方面的改善效果是非常明显的。
在图2.3 (b)中就非常容易分析乳房的组织。图像的负片同样可以利用工具箱函数imcomplement得到:
g = imcomplement(f)
图2.3 ©是使用如下命令的结果:
》> g2 = imadjust(f, [0.5 0.75], [0 1]);
该命令将0.5到0.75之间的灰度扩展到整个[0, 1]范围。这种类型的处理对于强调感兴趣灰度区非常有用。
最后,利用命令

g3 = imadjust(f,[ ],[ ], 2);
通过压缩灰度级的低端并扩展高端[见图2.3(d) ],得到类似于图2.3 ©的结果(增加了更多的灰色调)。
2.3函数intrans的说明
要说明函数intrans,首先要考虑图2.6(a)中的图像,这是-幅利用对比度拉伸方法来增强骨骼结
构的理想候选图像。图2.6(b)中的结果是利用如下对函数intrans的调用得到的:
9 =intrans(f,’ stretch’, mean2(tofloat(f)), 0.9);
figure, imshow(g)
注意函数mean2是如何直接在函数调用内部计算f的平均值的。产生的值为m所用。为了将其值标度到
范围[0, 1], 使用tofloat把图像f转换为了浮点类图像,从而使平均值m也在此范围内。E的值也就相
应地被确定了。
2.4计算并绘制图像直方图****
考虑来自图2.3(a)中的图像f。在屏幕上绘制其直方图的最简方法是使用没有规定输出的函数imhist:
imhist(f);
图2.7(a)显示了结果。这是在工具箱中利用默认值得出的直方图。然而,绘制直方图还有许多其他方
法,我们借此机会说明一下MATLAB中的一些绘图选项,它们是图像处理应用中所用的有代表性的选项。
直方图还可以利用条形图来绘制。为此,可使用函数
S
中。,!四丫98
bar(horz, z; width)
T,4是1的云的行向量;horz是个与z同维数的向量它包含了水平刻度的增量; width
是个介于0和1之间的数。换句话说,horz 的值给出了水平增量,而z的值是相应的垂直值。若horz被
省略,水平轴会从0至length(z)等分为若干单位。当width的值为1时,竖条较明显;当width值为0时,
竖条是垂直线。width 的默认值为0.8。绘制条形图时,通常会通过将水平轴等分为几段来降低其分辨率。

2.5直方图均衡。
图2.8(a)是花粉的电子显微图像,已放大了近700倍。就所需的图像增强而言,这幅图像最突出的特
点是较暗,且其动态范围较低。这些特点在图2.8 (b)所示的直方图中很明显,其中图像较暗的性质导致直
方图偏向于灰度级的暗端。从直方图相对于整个灰度范围非常狭窄的事实看出,其较低的动态范围是很明
显的。令f表示输人图像,下列各步骤产生图2.8 (a)到图2.8 (d)所示的结果。
》> imshow(f); % Fig. 2.8(a).
》> figure, imhist(f) % Fig. 2.8(b).

ylim(‘auto’)
figure, imshow(g) % Fig. 2.8©.
》> figure, imhist(g) % Fig. 2.8(d).
》> ylim( ’ auto’ )
图2.8 ©中的图像是直方图均衡后的结果。在平均灰度及对比
度方面的改进是非常明显的。如图2.8(d)所示,这些特点在图像的
直方图中也是很明显的。对比度增加源于直方图在整个灰度级上的
显著扩展。灰度级的增加源于均衡后的图像直方图中灰度级的平均由 dim指定的方向的和。
值高于(亮于)原始值。虽然刚刚讨论的直方图均衡方法并不能生成平坦的直方图,但它具有能增加图像灰
度级的动态范围的特性。
2.6直方图匹配。
图2.10(a)显示了火星天体福布司的图像f,图2.10(b)显示了使用imhist (f)得到的直方图。这幅
图像受大片较暗区域控制,造成直方图中大部分像素都集中在灰度级的暗端。乍看,一个可能的结论是
直方图均衡会是增强该图像的一种较好方法,因为这会使得较暗区域中的细节更加明显。但使用命令
f1 = histeq(f, 256);
后,结果如图2.10©所示,这结果表明,使用直方图均衡方法,在这种情况下,图像产生了“退色"
现象。研究如图2.10(d)所示均衡后图像的直方图后,我们可以找到出现这一现象的原因。这里,我们看
到灰度级已移到了较高端侧,因而给出了一幅低对比度且有褪色现象的图像。灰度级的移动是由于在原
始直方图中灰度级在0及其附近区域过于集中。由直方图得到的累积变换函数非常陡,因此把在低端过于
集中的像素点映射到了灰度级的高端。
能够补救这种现象的方法之一是利用直方图匹配, 期望的直方图在灰度级低端有较小的集中范围,并
能够保留原始图像直方图的大体形状。我们从图2.10(b)中注意到,直方图基本是双峰的,其中一-个较大
的模态位于原点处,另-个较小的模态位于灰度级的高端。这些类型的直方图可以被模型化,例如,使用
多模态高斯函数模拟。下面的M函数计算一个归一化到单位区域的双模态高斯函数,故它可被用做个
指定的直方图。
function p = twomodegauss(m1, s1g1, m2, s1g2, A1, A2, k)
twomodegauss
&TWOMODEGAUSS Generates a two- mode Gaussian function.
%P-TWOMODEGAUSS(M1, SIG1, M2, SIG2, A1, A2, K) generates a
5中。, !四丫8)-likefunction inthe interval [o0,11.Pisa
r normalized so that SUM§ = 1. The mean and
standard deviation of the modes are (M1, SIG1) and (M2, SIG2) ,
respectively. A1 and A2 are the amplitude values of the two
明modes. Since the output is normalized, only the relative values
2.7函数adapthisteq的使用。
图2.12(a)与图2.10(a)相同,图2.12 (b)是使用函数adapthisteq的全部默认设置得到的结果:
》g1 = adapthisteq(f);
虽然该结果在细节上稍有改善,但图像的重要部分仍然较暗。图2.12© 显示了将小片尺寸增加到[2525]
后的结果:
》g2 = adapthisteq(f, ’ NumTiles’, [25 25]);
清晰度稍有增加,但未见到新的细节。使用命令
g3 =adapthisteq(f, ’ NumTiles’,[2525],‘ClipLimit’, 0.05);
产生了图2.12(d) 所示的结果。与前面的两个结果相比,这幅图像的细节得到了明显增强。事实上,比较
图2.12(d)和图2.11 (b)可提供一个极好的佐证:局部增强方法好于全局增强方法,但付出的代价通常是额
外的函数复杂性。
能够保留原始图像直方图的大体形状。我们从图2.10(b)中注意到,直方图基本是双峰的,其中一-个较大
的模态位于原点处,另-个较小的模态位于灰度级的高端。这些类型的直方图可以被模型化,例如,使用
多模态高斯函数模拟。下面的M函数计算一个归一化到单位区域的双模态高斯函数,故它可被用做个
指定的直方图。
function p = twomodegauss(m1, s1g1, m2, s1g2, A1, A2, k)
twomodegauss
&TWOMODEGAUSS Generates a two- mode Gaussian function.
%P-TWOMODEGAUSS(M1, SIG1, M2, SIG2, A1, A2, K) generates a
5中。, !四丫8)-likefunction inthe interval [o0,11.Pisa
r normalized so that SUM§ = 1. The mean and
standard deviation of the modes are (M1, SIG1) and (M2, SIG2) ,
respectively. A1 and A2 are the amplitude values of the two
明modes. Since the output is normalized, only the relative values

2.8函数imfilter的应用
图2.16(a)是幅大小为512x 512像素的double类图像f。考虑个31x 31的滤波器

W = ones(31);
这是一个与平均滤波器成比例的滤波器。我们]未用(31)2去除系数,以便在本例的末尾说明使用imfilter
来标定一-幅uint8类图像的效果。
滤波器w与-幅图像进行卷积会产生模糊的结果。因为该滤波器是对称的,所以可以在imfilter
中使用默认的相关。图2.16(b)示出了执行下述滤波操作后的结果:
gd = imfilter(f, w);
imshow(gd,[ ])
此处使用了默认的边界选项,即用零(黑色)对图像边界进行填充。如期望的那样,滤波后的图像中黑白边
缘被模糊了,但只出现在图像较亮的部分与边界之间的边缘上。原因在于填充的边界是黑色的。使用
’ replicate ‘选项可解决这一问题:
》> gr - imfilter(f, w," replicate’);
》> figure, imshow(gr, [ ])
如图2.16©所示,滤波后图像的边界正如我们所料。此时,使用选项’ symmetric’可以获得相同的结果:
gs = imfilter(f, w,’ symmetric’);
figure, imshow(gs, [ ])
图2.16(d)显示了结果。然而,使用’circular ‘选项
》> gc = imfilter(f, w,‘circular’);
》> figure, imshow(gc, [ 1)
产生了如图2.16(e)所示的结果,它显示了与零填充出现的同样问题。这也正如我们所料,因为周期性的
使用可使得图像的黑暗部分邻近明亮区域。
最后,我们说明imfilter产生与输人相同类的结果,但处理不当会产生很大问题:
》f8 = im2uint8(f);

2.9使用函数 colfilt实现非线性空间滤波
正如对函数colfilt的说明那样,我们实现个非线性滤波器, 该滤波器在任何点的响应都是以该
点为中心点的邻域中的像索灰度值的几何平均。大小为mx n的邻域中的几何平均是该邻域内灰度值乘积
的1/mn次幂。首先如置名函数句柄(见1.7.8节)那样实现该非线性滤波器函数:

gmean = @(A) prod(A, 1)^1/size(A, 1));
为了削减边界效应, 使用函数padarray中的选项, replicate '来填
充输入图像:
f = padarray(f, [m n],‘replicate’);
接下来,调用函数colfilt:
g= colfilt(f, [m n],‘sliding’, @gmean) ;
这里有几个要点。首先,应当注意使用colfilt自动地将矩阵A
传递给了函数句柄gmean;其次,如前所述,矩阵A总有mn行,但列数可变。因此,gmean (或任何由
colfilt传递的其他函数句柄)必须写成可处理可变列数的形式。
此时,滤波过程是计算邻域内所有像素的乘积,并将结果取1/mm次幂。对于任意值(x,y),该点的滤
波结果包含在v中的适当列中。关键要求是函数对A的列进行操作,而不管有多少列,并返回一个包含所
有单独列的行向量。然后,函数colfilt获得这些结果,并对其重新排列以产生输出图像g。
最后,删除先前插人的填充:
[M,N]= size(f);
g= g((1:M)+ m, (1:N) + n);
以便g的大小与f的大小相同。
一些通用的非线性滤波器可以通过其他MATLAB和工具箱函数实现。

2.10使用函数 imfilter实现拉普拉斯滤波器。
下面通过使用一个拉普拉斯滤波器增强图像,来说明函数fspecial 和imfilter 的用法。图像
f(x,y)的拉普拉斯算子定义为V2f(x,y):
下面应用拉普拉斯算子来增强图2.17(a)所示的图像。这是-幅略显模糊的月球北极图像。此时,对
图像的增强操作是锐化图像,同时尽可能地保留其灰度层次。首先,生成并显示该拉普拉斯滤波器:
》> w=fspecial(‘laplacian’, 0)
w=
0. 0000

  1. 0000
  2. 0000 -4 .0000
  3. 0000
    主意,该滤波器是double类的,其alpha - 0的形状是前面讨论过的拉普拉斯滤波器。我们可以很容
    数字图像处理(MATLAB版) (第二版) (本科教学版)
    》> w=[010;1-4,1;0 10];
    下面对输人图像f [见图2.17(a) ]应用w,图像f是uint8类图像:

g1 = imfilter(f, w,’ replicate’);
》> imshow(g1, [ ])
图2.17(b)显示了结果图像。这一结果看起来是合理的,但存在一个问题:所有的像素都是正的。由于滤波器
中心系数为负,因此我们通常希望得到的是个带有 正值和负值的拉普拉斯图像。但此时,f是uint8类的,
如前一节所述,imfilter给出了与输人图像类相同的输出,所以负值被截掉了。在对图像f滤波前,通
过将其转换为浮点数可解决这一问题:
》f2 = tofloat(f);
g2 = imfilter(f2, w, ‘replicate’);
imshow(g2, [ ])
图2.17©显示的结果是拉普拉斯图像的典型外观。
最后,从原始图像中减去(因为中心系数为负值)拉普拉斯图像,以恢复失去的灰度层次:
g=f2-92;
imshow(g);

2.11手工指定滤波 器及增强技术的比较
增强问题常常需要工具箱之外的滤波器。拉普拉斯滤波器就是一个很好的例子。工具箱支持个中心
系数为- 4的3x3拉普拉斯滤波器。通常,使用中心系数为-8、周围值均为1的3x3拉普拉斯滤波器,
可得到更为清晰的图像。本例的目的是手工实现这个滤波器,并比较使用这两种拉普拉斯方式得到的结果。
命令序列如下:

f =imread(‘Fig0217(a).tif’);
W4 =fspecial(’ laplacian’, 0); %Same as w in Example 2.10.
》> w8=[111;1-81;111];
f= tofloat(f);
g4 =f - imfilter(f, W4, ‘replicate’
g8=f-imfilter(f, w8, ’ replicate’);
imshow(f)
figure, imshow(g4)
figure, imshow(g8)
数字图像处理(MATLAB版) (第二版) (本科教学版)
》> w=[010;1-4,1;0 10];
下面对输人图像f [见图2.17(a) ]应用w,图像f是uint8类图像:
g1 = imfilter(f, w,’ replicate’);
》> imshow(g1, [ ])
图2.17(b)显示了结果图像。这一结果看起来是合理的,但存在一个问题:所有的像素都是正的。由于滤波器
中心系数为负,因此我们通常希望得到的是个带有 正值和负值的拉普拉斯图像。但此时,f是uint8类的,
如前一节所述,imfilter给出了与输人图像类相同的输出,所以负值被截掉了。在对图像f滤波前,通
过将其转换为浮点数可解决这一问题:
》f2 = tofloat(f);
g2 = imfilter(f2, w, ‘replicate’);
imshow(g2, [ ])
图2.17©显示的结果是拉普拉斯图像的典型外观。
最后,从原始图像中减去(因为中心系数为负值)拉普拉斯图像,以恢复失去的灰度层次:
g=f2-92;
imshow(g);

2.12利用函数 medfilt2 进行中值滤波。
中值滤波是降低图像中椒盐噪声的一种有用工具。 虽然要到第4章才详细地讨论降噪,但在此处简单
介绍一下中值滤波的实现还是有益的。
图2.19(a)是一块工业电路板在自动检测期间所拍摄的X射线图像f。图2.19 (b)是被椒盐噪声污染的
同一幅图像,图像中黑点和白点出现的概率为0.2。这幅图像是利用函数imnoise生成的:

fn = imnoise(f, ‘salt & pepper’, 0.2);
图2.19©是对该带噪图像进行中值滤波处理后的结果,使用的语句如下:
Innoise
》> gm = medfilt2(fn);
考虑图2.19(b) 中的噪音水平,中值滤波采用默认设置很好地实现了降噪。但要注意围绕图像边界的
黑色污点,这些黑色污点是由围绕图像的黑点引起的(回忆可知默认使用0来对边界进行填充)。使用
‘symmetric’选项可降低这种效应:
》> gms = medfilt2(fn, ’ symmetric’);
图2.19(d)所示结果与图2.19 ©所示结果相近,但黑色边框效应已不再那么明显。
figure, imshow(g8)
数字图像处理(MATLAB版) (第二版) (本科教学版)
》> w=[010;1-4,1;0 10];
下面对输人图像f [见图2.17(a) ]应用w,图像f是uint8类图像:
g1 = imfilter(f, w,’ replicate’);
》> imshow(g1, [ ])
图2.17(b)显示了结果图像。这一结果看起来是合理的,但存在一个问题:所有的像素都是正的。由于滤波器
中心系数为负,因此我们通常希望得到的是个带有 正值和负值的拉普拉斯图像。但此时,f是uint8类的,
如前一节所述,imfilter给出了与输人图像类相同的输出,所以负值被截掉了。在对图像f滤波前,通
过将其转换为浮点数可解决这一问题:
》f2 = tofloat(f);
g2 = imfilter(f2, w, ‘replicate’);
imshow(g2, [ ])
图2.17©显示的结果是拉普拉斯图像的典型外观。
最后,从原始图像中减去(因为中心系数为负值)拉普拉斯图像,以恢复失去的灰度层次:
g=f2-92;
imshow(g);

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>