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