3.2 灰度的线性变换

灰度线性变换是最常用的图像点运算之一,将图像的像素值通过指定的线性函数进行变换,以此增强或减弱图像的灰度。

3.2.1 理论基础

线性灰度变换函数f(x)是一个一维线性函数。

式中:参数fA为线性函数的斜率;fB为线性函数在y轴的截距;DA表示输入图像的灰度;DB表示输出图像的灰度。

● 当fA>1时,输出图像的对比度将增大;当fA<1时,输出图像的对比度将减小。

● 当fA=1且fB≠0时,操作仅使所有的像素的灰度值上移或下移,其效果是使整个图像更暗或更亮;如fA<0,暗区域将变亮,亮区域将变暗。这种线性改变亮度的变换可能由于像素亮度达到饱和(小于0或超过255)从而丢失一部分细节。

● 特殊情况下,当 fA=1,fB=0时,输出图像与输入图像相同;当 fA= -1,fB=255时,输出图像的灰度正好反转。灰度反转处理适用于增强暗色图像中的亮度较大的细节部分,这也是由人的视觉特性决定的。

图 3.5 给出了一些对应于上述情况的变换实例,后面的Matlab实现中将分别展示应用这些变换的实际效果。

▲图3.5 线性变换示意图

3.2.2 Matlab实现

使用Matlab对图像执行线性变换无需专门的函数,下面的例3.1对Matlab示例图像coins.jpg进行了不同参数的线性变换操作。

[例3.1]不同参数的线性变换效果

本例中对Matlab示例图像coins.png进行了如图3.5中所示的增加对比度、减小对比度、线性平移增加亮度和反相显示4种线性变换,给出了变换效果以及其对应的直方图变化情况。

ex3_1.m

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

I = im2double(I);      %转换数据类型为double

[M,N] = size(I);      %计算图像面积

figure(1);         %打开新窗口

imshow(I);           %显示原图像

title('原图像');

figure(2);           %打开新窗口

[H,x] = imhist(I, 64);     %计算64个小区间的灰度直方图

stem(x, (H/M/N), '.');     %显示原图像的直方图

title('原图像');

% 增加对比度

Fa = 2; Fb = -55;

O = Fa .* I + Fb/255;

figure(3);

subplot(2,2,1);

imshow(O);

title('Fa = 2 Fb = -55 增加对比度');

figure(4);

subplot(2,2,1);

[H,x] = imhist(O, 64);

stem(x, (H/M/N), '.');

title('Fa = 2 Fb = -55 增加对比度');

% 减小对比度

Fa = 0.5; Fb = -55;

O = Fa .* I + Fb/255;

figure(3);

subplot(2,2,2);

imshow(O);

title('Fa = 0.5 Fb = -55 减小对比度');

figure(4);

subplot(2,2,2);

[H,x] = imhist(O, 64);

stem(x, (H/M/N), '.');

title('Fa = 0.5 Fb = -55 减小对比度');

% 线性增加亮度

Fa = 1; Fb = 55;

O = Fa .* I + Fb/255;

figure(3);

subplot(2,2,3);

imshow(O);

title('Fa = 1 Fb = 55 线性平移增加亮度');

figure(4);

subplot(2,2,3);

[H,x] = imhist(O, 64);

stem(x, (H/M/N), '.');

title('Fa = 1 Fb = 55 线性平移增加亮度');

% 反相显示

Fa = -1; Fb = 255;

O = Fa .* I + Fb/255;

figure(3);

subplot(2,2,4);

imshow(O);

title('Fa = -1 Fb = 255 反相显示');

figure(4);

subplot(2,2,4);

[H,x] = imhist(O, 64);

stem(x, (H/M/N), '.');

title('Fa = -1 Fb = 255 反相显示');

上述程序存放在金羽图书论坛(http://bbs.book95.com)的“金羽图书与答疑”板块与本书同名的主题帖子附件中“Chapter3/Code”目录下的ex3_1.m文件中,其运行结果如图3.6所示。

▲图3.6 线性变换实例说明

从图 3.5、图 3.6 可以看出:改变图像的对比度是对直方图的缩放与平移,改变图像的亮度则只是平移直方图在横轴上的位置,而反相则是将直方图水平镜像。

单纯的线性灰度变换可以在一定程度上解决视觉上的图像整体对比度问题,但是对图像细节部分的增强则较为有限,结合后面将要介绍的非线性变换技术可以解决这一问题。