灰度的线性变换
线性灰度变换函数f(x)是一个一维线性函数。可以用
Db=f(Da)=kDa+b
进行表示,其中k是线性函数的斜率,k是线性函数的截距,而Da表示输入图像的灰度,Db表示输出图像的灰度。
- 当k>1的时候,输出图像的对比度将会增大;反之,输出图像的对比度将会减小。
- 当k=1且b不等于0的时候,操作仅使所有的像素的灰度值上移或下移,效果也就是让亮度变大或者变小。
- 当k<0,暗区域将会变亮,亮区域将会变暗,可能是由于像素亮度达到饱和,也就是超过[0,255]这个区间,从而丢失了一部分细节。
- 特殊情况,当k=1,b=0时,输入输出图像相同;当k=-1,b=255时,输入输出图像灰度正好反转(可以用于增强暗色图像中亮度较大的细节部分)。
用matlab进行了不同参数的基本线性变换的操作,如下,
I = imread('test.bmp'); % 读入原图像
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('原图像');
% 增加对比度
k = 2; b = -55;
O = k .* I + b/255; %这里是由于之前进行了double数据类型的
%转换,导致数据均为(0,1)因此需要除以255
figure(3);
subplot(2,2,1);
imshow(O);
title('k = 2 b = -55 增加对比度');
figure(4);
subplot(2,2,1);
[H,x] = imhist(O, 64);
stem(x, (H/M/N), '.');
title('k = 2 b = -55 增加对比度');
% 减小对比度
k = 0.5; b = -55;
O = k .* I + b/255;
figure(3);
subplot(2,2,2);
imshow(O);
title('k = 0.5 b = -55 减小对比度');
figure(4);
subplot(2,2,2);
[H,x] = imhist(O, 64);
stem(x, (H/M/N), '.');
title('k = 0.5 b = -55 减小对比度');
% 线性增加亮度
k = 1; b = 55;
O = k .* I + b/255;
figure(3);
subplot(2,2,3);
imshow(O);
title('k = 1 b = 55 线性平移增加亮度');
figure(4);
subplot(2,2,3);
[H,x] = imhist(O, 64);
stem(x, (H/M/N), '.');
title('k = 1 b = 55 线性平移增加亮度');
% 反相显示
k = -1; b = 255;
O = k .* I + b/255;
figure(3);
subplot(2,2,4);
imshow(O);
title('k = -1 b = 255 反相显示');
figure(4);
subplot(2,2,4);
[H,x] = imhist(O, 64);
stem(x, (H/M/N), '.');
title('k = -1 b = 255 反相显示');
其运行结果如下,可以看到,原图像为
原图像的归一化灰度直方图为
分别进行线性变换
可以看出,改变对比度是对直方图的缩放与平移,改变亮度只是平移直方图在横轴上的位置,而反向则是将直方图水平镜像。
灰度对数变换
对数变换的一般表达式如下,
t=clog(1+s)
其中,c为尺度比例常数,s为源灰度值,t为变换后的目标灰度值。
由该函数曲线,我们可以看到,函数自变量在低值的时候,曲线斜率很高,自变量在高值的时候,曲线斜率很低,由此可以得知,在实际应用的时候,这样做可以用来增强一副图像较暗部分的细节。