图像处理入门(一):一些常用的灰度变换函数

引言

        视觉的工作我习惯分为软硬两部分,我主要介绍软件部分的一些工作以及入门方法。视觉的启蒙,我认为最好的是《数字图像处理》冈萨雷斯版本,我会按照此书的学习顺序去介绍图像处理算法,并通过matlab封装的函数实现。对于算法原理可以参考此书的讲解以及网上的资料。
 


一些基本的灰度变换函数

图像反转(灰度反转):

        在灰度图像中,每个像素的值 r 通常表示亮度,范围是 [0,L−1],图像反转公式是:s=L-1-r。根据公式可以展开列表直观表达(8位图像)。

原灰度 r反转灰度 s = L - 1 - r
0255
50205
127128
128127
2550

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('对数变换图像');

 效果图:

伽马变换:

        与对数变换类似,调整图像像素值,但更灵活。公式:s=c\cdot r^{\gamma }

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)

公式为:s_{k}=T\left(r_{k}\right)=\sum_{j=0}^{k} p_{r}\left(r_{j}\right)

这是对原始图像灰度值的累计概率分布,其值范围在 [0,1]。

3.将原灰度值映射到新的值 ​(归一化后乘以 L−1):

公式表达为:s_{k}^{\prime}=\operatorname{round}\left((L-1) \cdot s_{k}\right)

这个 s_{k}^{\prime}就是均衡化后的像素值。换句话说,我们重新分配每个灰度值的位置,使得整体的灰度分布尽量平坦。冈萨雷斯在连续空间的直观表达:

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('均衡化后直方图');

效果图:


结束语

        以上是对常用的函数整体梳理,在冈萨雷斯会给出更详细的推导和推广。比如直方图正则化,局部直方图,线性变换,但万变不离其中,掌握上述函数就掌握了基本的灰度变换函数,基于此再去拓展和根据兴趣学习就会更加顺畅。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值