引言
视觉的工作我习惯分为软硬两部分,我主要介绍软件部分的一些工作以及入门方法。视觉的启蒙,我认为最好的是《数字图像处理》冈萨雷斯版本,我会按照此书的学习顺序去介绍图像处理算法,并通过matlab封装的函数实现。对于算法原理可以参考此书的讲解以及网上的资料。
一些基本的灰度变换函数
图像反转(灰度反转):
在灰度图像中,每个像素的值 r
通常表示亮度,范围是 [0,L−1],图像反转公式是:s=L-1-r。根据公式可以展开列表直观表达(8位图像)。
原灰度 r | 反转灰度 s = L - 1 - r |
---|---|
0 | 255 |
50 | 205 |
127 | 128 |
128 | 127 |
255 | 0 |
matlab代码:
% 读取灰度图像
I = imread('tiger.png'); % 确保这是灰度图像,或者用 rgb2gray 转换
% 如果是彩色图像,先转为灰度图像
if size(I, 3) == 3
I = rgb2gray(I);
end
% 获取图像的灰度等级
L = 256; % 对于8位图像,灰度范围是0~255
% 进行灰度反转
I_inverted = L - 1 - I;
% 显示原图与反转图
subplot(1,2,1);
imshow(I);
title('原始图像');
subplot(1,2,2);
imshow(I_inverted);
title('灰度反转图像');
效果图:
对数变换:
对数变换的基本思想是:将图像的像素值映射到它的对数值,使得较暗区域被拉伸,较亮区域被压缩。可利用公式:s = clog(1+r)实现,值得注意的是:c是缩放常数,确保结果值在合理范围内(比如 0∼255)。冈萨雷斯版本图像直观解释:
matlab代码:
% 读取灰度图像
I = imread('tiger.png');
if size(I, 3) == 3
I = rgb2gray(I);
end
% 将像素值转换为 double 类型,便于计算
I_double = double(I);
% 对数变换常数(根据最大灰度值调节)
c = 255 / log(1 + max(I_double(:)));
% 执行对数变换
I_log = c * log(1 + I_double);
% 转回 uint8 类型以显示和保存
I_log = uint8(I_log);
% 显示结果
subplot(1,2,1);
imshow(I);
title('原始图像');
subplot(1,2,2);
imshow(I_log);
title('对数变换图像');
效果图:
伽马变换:
与对数变换类似,调整图像像素值,但更灵活。公式:
matlab代码:
% 读取图像
I = imread('tiger.png');
% 如果是彩色图像,转为灰度
if size(I, 3) == 3
I = rgb2gray(I);
end
% 转为 double 类型,并归一化到 [0, 1]
I_norm = im2double(I);
% 设置伽马值(<1 提亮暗部;>1 压暗亮部)
gamma = 0.4; % 你可以试试 0.4、1.0、2.0 等值
c = 1; % 常规情况下设为 1
% 执行伽马变换
I_gamma = c * (I_norm .^ gamma);
% 显示图像
subplot(1,2,1);
imshow(I);
title('原始图像');
subplot(1,2,2);
imshow(I_gamma);
title(['伽马变换图像(\gamma = ' num2str(gamma) ')']);
效果图:
直方图均衡 :我们对图像进行直方图均衡一般分为三步:
1.统计每个灰度值在图像中出现的次数。比如灰度为 50 的像素有多少个、灰度为 200 的又有多少个。统计的格式被称为直方图:
2.计算概率密度的累计分布函数(CDF)
公式为:
这是对原始图像灰度值的累计概率分布,其值范围在 [0,1]。
3.将原灰度值映射到新的值 (归一化后乘以 L−1):
公式表达为:
这个 就是均衡化后的像素值。换句话说,我们重新分配每个灰度值的位置,使得整体的灰度分布尽量平坦。冈萨雷斯在连续空间的直观表达:
matlab代码:
% 读取图像
img = imread('tiger.png');
gray = rgb2gray(img); % 转为灰度图
% 获取图像尺寸
[M, N] = size(gray);
total_pixels = M * N;
% 计算直方图
hist_counts = imhist(gray);
% 计算累计分布函数(CDF)
cdf = cumsum(hist_counts) / total_pixels;
% 构建映射关系:将原始像素映射到均衡后的像素
equalized = uint8(255 * cdf(gray + 1));
% 显示结果
subplot(2,2,1), imshow(gray), title('原始灰度图');
subplot(2,2,2), imhist(gray), title('原始直方图');
subplot(2,2,3), imshow(equalized), title('均衡化后图像');
subplot(2,2,4), imhist(equalized), title('均衡化后直方图');
效果图:
结束语
以上是对常用的函数整体梳理,在冈萨雷斯会给出更详细的推导和推广。比如直方图正则化,局部直方图,线性变换,但万变不离其中,掌握上述函数就掌握了基本的灰度变换函数,基于此再去拓展和根据兴趣学习就会更加顺畅。