一幅图像中,最高灰度级和最低灰度级的差成为对比度。一幅低对比度的图像,看起来细节会少很多。可以通过对比度拉伸提高图像对比度,显示更多细节。先来看看对比度拉伸的典型变换:
书本中(冈萨雷斯:数字图像处理第三版P69)的对比度拉伸变换函数图是这样的:
图3.10(b)低对比度拉伸图中,最低灰度级为91,最高灰度级为138,并且要将灰度值拉伸至[0, 255]。阈值处理的函数的图像即为P64图3.2第二个图像,其中k = 109。
实验代码如下:
% 读入图像
img_1 = imread('Fig0310(b)(washed_out_pollen_image).tif');
% max():返回一个行向量,向量的第i个元素是矩阵A的第i列上的最大值。
% 再一次即可求得最高灰度级
r_max = max(max(img_1));
% 与 max() 同理
r_min = min(min(img_1));
% 求输入图像的尺寸
[r, c] = size(img_1);
% 生成两张0图,一张用于对比度拉伸,一张用于阈值处理
img_2 = zeros(r, c);
img_3 = zeros(r, c);
% 将输入图像转换成double型
img_1s = double(img_1);
% 计算斜率
k = (255 - 0) / (r_max - r_min);
% 灰度级总和
sum = 0;
for x = 1 : r
for y = 1 : c
% 对每个像素点进行拉伸,并赋值到新图像
img_2(x, y) = k * (img_1s(x, y) - r_min);
% 求灰度级总和
sum = sum + img_1s(x, y);
end
end
% 求阈值,这里阈值为平均值
avg = sum / (r * c);
% 阈值处理
for x = 1 : r
for y = 1 : c
% 小于阈值赋值0
if img_1s(x, y) < avg
img_3(x, y) = 0;
% 大于阈值赋值1
else
img_3(x, y) = 1;
end
end
end
% 转换
img_2 = im2uint8(mat2gray(img_2));
img_3 = im2uint8(mat2gray(img_3));
% 显示
subplot(131), imshow(img_1);
subplot(132), imshow(img_2);
subplot(133), imshow(img_3);
结果如下: