灰度变换与空间滤波 – 图像的“自动美颜术”:直方图均衡化让暗图变清晰✨

212次阅读

🎯 第一部分:直方图均衡化是啥?——让亮度“雨露均沾”

关键字:直方图均衡化、累积分布函数(CDF)、动态范围扩展

🧠 初学者先懂:你有没有拍过“灰蒙蒙的暗图”——亮度全挤在暗部,细节看不清?直方图均衡化就是“把暗部的亮度拉开,让每个亮度级都有足够像素”,相当于给图像“自动打光”。

内容详解:

📖 核心原理:用 累积分布函数(CDF)做变换——把输入灰度级 r 映射到输出灰度级s,公式是:

连续版:s = T(r) = ∫₀ʳ pᵣ(w)dwpᵣ是输入灰度的概率密度)

离散版:sₖ = Σⱼ₌₀ᵏ (nⱼ/n)nⱼ是第 j 个灰度级的像素数,n是总像素数)

🤖 类比理解:就像把“挤在角落的人群”均匀分散到整个房间——原来暗部的像素被“拉”到亮部,亮部的像素被“拉”到更亮,最终每个亮度区间都有像素,对比度直接拉满!

💻 直观感受:图 2.8(a)是暗的花粉图,均衡化后(图 2.8(c)),花粉的纹理和细节全清晰了!

👐 第二部分:怎么实现直方图均衡化?——代码 + 步骤手把手教

关键字:histeq、CDF 计算、手动实现均衡化

🧠 初学者再懂:实现均衡化有两种方式——用 MATLAB 自带的histeq(一键搞定),或手动算 CDF(理解原理)。

内容详解:

📖 方式 1:用 histeq 一键操作(课本例 2.5)

% 1. 读入并显示原图
f = imread('花粉图.jpg'); % 替换成你的图像路径
imshow(f); title('原图');

% 2. 显示原图直方图
figure; imhist(f); title('原图直方图');

% 3. 直方图均衡化(nlev=255 对应 uint8 的灰度级)g = histeq(f, 256);

% 4. 显示均衡化后的图和直方图
figure; imshow(g); title('均衡化后的图');
figure; imhist(g); title('均衡化后的直方图');

📖 方式 2:手动算 CDF(理解底层逻辑)

% 1. 计算原图直方图和归一化直方图
[h, r] = imhist(f);
hnorm = h / numel(f); % 归一化(每个灰度级的概率)% 2. 计算 CDF(累积求和)cdf = cumsum(hnorm); % cumsum 是“累积和”函数

% 3. 把 CDF 映射到 0 -255(因为 uint8 图的灰度级是 0 -255)s = uint8(255 * cdf);

% 4. 生成均衡化后的图像(用映射关系替换每个像素)g_manual = s(f + 1); % f+ 1 是因为 MATLAB 索引从 1 开始

🤖 为啥这么做?cdf是“累积概率”,乘以 255 是把 0 - 1 的概率映射到 0 -255 的灰度级——原来暗部的像素(比如灰度 10)对应的 CDF 值小,乘以 255 后会变成更大的数(比如 50),相当于“变亮了”!

☁️ 注意:histeq默认nlev=64,如果要和手动结果一致,记得设nlev=256

✨ 第三部分:均衡化的“魔法”——CDF 变换函数的作用

关键字:变换函数、亮度映射、对比度增强

🧠 初学者最后懂:均衡化的核心是“CDF 变换函数”——它决定了“输入灰度怎么映射到输出灰度”。

内容详解:

📖 看课本图 2.9:变换函数是“快速上升的曲线”——输入灰度 0 -0.2(暗部)被映射到输出灰度 0 -1(整个范围),原来挤在暗部的像素被“拉伸”到所有亮度区间,这就是“暗图变清晰”的秘密!

💻 画变换函数的代码:

x = linspace(0, 1, 256); % 输入灰度的归一化范围(0-1)plot(x, cdf); % 画 CDF(变换函数)xlabel('输入灰度值'); ylabel('输出灰度值');
title('直方图均衡化的变换函数');

🤖 现实应用:均衡化常用于“医学影像增强”(比如 X 光片、CT 图)——原来暗的病灶被拉亮,医生能更清楚看到病变;还用于“监控摄像头的夜视增强”,让暗环境下的物体更明显!

☁️ 复杂场景:如果图像本身对比度已经很高,均衡化可能会“过增强”(比如亮部过曝)——这时候可以用“直方图规定化”(后面 2.3.3 的内容),自定义想要的直方图形状!

🌟 总结:直方图均衡化的“优缺点”

→ 优点:自动增强对比度,不用调参数,对暗图 / 低对比度图效果显著;

→ 缺点:结果不可控,可能过增强,对高对比度图不友好;

就像“自动美颜滤镜”——对素颜暗图效果超棒,但对已经化好妆的图可能会“磨皮过度”。不过作为“图像增强入门第一招”,它的实用性拉满!

正文完
 0