🎯 第一部分:直方图均衡化是啥?——让亮度“雨露均沾”
关键字:直方图均衡化、累积分布函数(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 的内容),自定义想要的直方图形状!
🌟 总结:直方图均衡化的“优缺点”
→ 优点:自动增强对比度,不用调参数,对暗图 / 低对比度图效果显著;
→ 缺点:结果不可控,可能过增强,对高对比度图不友好;
就像“自动美颜滤镜”——对素颜暗图效果超棒,但对已经化好妆的图可能会“磨皮过度”。不过作为“图像增强入门第一招”,它的实用性拉满!