✨ 第一部分:直方图是啥?——图像的“亮度分布账本”
关键字:直方图、灰度级、归一化直方图
🧠 初学者先懂:直方图就是图像的“亮度账本”——统计每个灰度级(比如0=黑,255=白)有多少个像素。比如一张“偏暗的图”,直方图会堆在0附近;一张“偏亮的图”,会堆在255附近。
内容详解:
📖 课本里的直方图公式是 h(r_k) = n_k(r_k是第k个灰度级,n_k是这个灰度级的像素数)。归一化直方图是 p(r_k) = n_k / n(n是总像素数),代表每个灰度级出现的“概率”。
🤖 类比理解:就像统计班级考试分数——直方图是“80分有10人,90分有5人”;归一化直方图是“80分占20%,90分占10%”。
💻 怎么算?用MATLAB的imhist函数:
% 计算直方图(h是各灰度级的像素数,r是灰度级)
[h, r] = imhist(f);
% 计算归一化直方图
p = h / numel(f); % numel(f)是图像总像素数
☁️ 复杂场景:不同类型图像的直方图范围不同——uint8图的灰度级是0-255,uint16图是0-65535,浮点图是0-1,计算时要注意对应范围!
👐 第二部分:直方图怎么画?——四种画法各显神通
关键字:imhist、bar、stem、plot、直方图绘制工具
🧠 初学者再懂:画直方图就像“展示账本”——不同画法适合看不同细节,课本里给了4种“展示方式”。
内容详解:
📖 四种画法+代码(以uint8图像为例):
- ① imhist直接画(图2.7(a)):最简单的默认画法 imhist(f); % 直接显示直方图
- ② bar画条形图(图2.7(b)):适合看“分组统计” [h, r] = imhist(f, 25); % 分成25组统计 horz = linspace(0, 255, 25); % 生成25个灰度级刻度 bar(horz, h); % 画条形图 axis([0 255 0 60000]); % 设置坐标轴范围
🤖 好处:把256个灰度级合并成25组,能更清楚看“亮度区间的分布”(比如暗部区间有多少像素)。 3. ③ stem画杆状图(图2.7(c)):适合看“单个灰度级的细节” [h, r] = imhist(f, 25); horz = linspace(0, 255, 25); stem(horz, h, ‘fill’); % ‘fill’让杆顶的点填充颜色 set(gca, ‘xtick’, 0:50:255); % 设置x轴刻度间隔
🤖 好处:每个杆对应一个分组,能精准看到“某一组的像素数”(比如第10组有多少像素)。 4. ④ plot画折线图(图2.7(d)):适合看“分布趋势” [h, r] = imhist(f); plot(h); % 用折线连接各灰度级的像素数 axis([0 255 0 15000]);
🤖 好处:能直观看到直方图的“起伏趋势”(比如暗部到亮部是递增还是递减)。
☁️ 现实应用:做“图像增强”前,先画直方图看亮度分布——暗部堆太多就“提亮”,亮部堆太多就“压暗”,这是图像后期的“第一步操作”!
🎯 第三部分:直方图“美化术”——坐标轴、标题、标签怎么加?
关键字:axis、xlabel、ylabel、title、图形美化
🧠 初学者最后懂:画直方图不能只有图,得加“标签和标题”,不然别人不知道你画的是啥——这就像给“账本”加封面和目录。
内容详解:
📖 常用美化代码:
[h, r] = imhist(f);
bar(r, h);
% 设置坐标轴范围
axis([0 255 0 60000]);
% 加x轴标签(灰度级)
xlabel('灰度级', 'fontsize', 12);
% 加y轴标签(像素数)
ylabel('像素数', 'fontsize', 12);
% 加标题
title('图像亮度分布直方图', 'fontsize', 14);
% 设置刻度间隔
set(gca, 'xtick', 0:50:255);
set(gca, 'ytick', 0:20000:60000);
🤖 为啥要美化?比如给导师看报告,带标签的直方图能直接说明“这张图暗部像素占比高”,不用额外解释——专业度直接拉满!
☁️ 扩展技巧:用hold on可以在同一张图里画“原图和增强后图的直方图”,对比效果一目了然(比如“增强后暗部和亮部分开了”)。
🌟 总结:直方图的“灵魂作用”
→ 看分布:从直方图能直接判断图像是“偏暗”“偏亮”还是“对比度低”;
→ 做增强:直方图是“亮度调整”的依据(比如直方图均衡化就是让分布更均匀);
→ 做分析:工业检测中,“次品零件的直方图”和“合格零件的直方图”有明显差异,能用来自动挑次品!
就像医生看“体检报告”——直方图就是图像的“健康指标”,看懂它,你就能精准“调理”图像啦!