🎯 第一部分:直方图均衡化是啥?——让亮度“雨露均沾”
关键字:直方图均衡化、累积分布函数(CDF)、动态范围扩展
🧠 初学者先懂:你有没有拍过“灰蒙蒙的暗图”——亮度全挤在暗部,细节看不清?直方图均衡化就是“把暗部的亮度拉开,让每个亮度级都有足够像素”,相当于给图像“自动打光”。 内容详解: 📖 核心原理:用
累积分布函数(CDF)
做变换——把输入灰度级
r
映射到输出灰度级
s
,公式是: 连续版:
s = T(r) = ∫₀ʳ pᵣ(w)dw
(
pᵣ
是输入灰度的概率密度) 离散版:
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的内容),自定义想要的直方图形状!
🌟 总结:直方图均衡化的“优缺点”
→ 优点:
自动增强对比度
,不用调参数,对暗图/低对比度图效果显著; → 缺点:
结果不可控
,可能过增强,对高对比度图不友好; 就像“自动美颜滤镜”——对素颜暗图效果超棒,但对已经化好妆的图可能会“磨皮过度”。不过作为“图像增强入门第一招”,它的实用性拉满!