精通Matlab数字图像处理与识别
上QQ阅读APP看书,第一时间看更新

3.3 灰度对数变换

本节介绍一种灰度的非线性变换——对数变换,并介绍它在傅立叶频谱显示中的应用。

3.3.1 理论基础

对数变换的一般表达式如下。

其中c为尺度比例常数,s为源灰度值,t为变换后的目标灰度值。

在如图3.7所示的对数曲线上,函数自变量低值时,曲线的斜率很高;自变量高值时,曲线斜率变小。

▲图3.7 对数变换示意图

由对数函数曲线可知,这种变换可以增强一幅图像中较暗部分的细节,从而可用来扩展被压缩的高值图像中的较暗像素,因此对数变换被广泛地应用于频谱图像的显示中。一个典型的应用是傅立叶频谱(参见第 6 章),其动态范围可能宽达 0~106 。直接显示频谱时,图像显示设备的动态范围往往不能满足要求,从而丢失了大量的暗部细节。而在使用对数变换之后,图像的动态范围被合理地非线性压缩,从而可以清晰地显示。本节的Matlab实现中就提供了一个这样的示例。

3.3.2 Matlab实现

对数变换不需要专门的图像处理函数,可以使用如下数学函数实现对图像I的对数变换。

T = log(I + 1);

注意

log函数会对输入图像矩阵I中的每个元素进行操作,但是却仅能处理double类型的矩阵。从图像文件中得到的图像矩阵则大多数是uint8类型的,因此需要首先使用im2double函数来执行数据类型的转换。

下面的程序比较了对傅立叶频谱图像进行对数变换前后的效果(不必关注代码中生成傅立叶频谱的部分)。

I=imread('coins.png'); %读取图像

F = fft2(im2double(I)); %计算频谱

F = fftshift(F);

F = abs(F);

T$space@= log(F + 1); %对数变换

subplot(1,2,1);

imshow(F, []);

title('未经变换的频谱');

subplot(1,2,2);

imshow(T, []);

title('对数变换后'); %显示原图和变换结果

上述程序的运行结果如图3.8所示。

▲图3.8 对数变换效果示意图

由图3.8(a)中未经变换的频谱可见,图像中心绝对高灰度值的存在压缩了低灰度部分的动态范围,从而无法在显示时表现出细节;而经过对数灰度处理的图像,其低灰度区域对比度将会增加,暗部细节被增强。