一、图像直方图基础:从概念到实战
图像直方图,说白了就是一张图的「像素统计报告」。我刚开始接触图像处理时,总觉得这玩意儿不就是个柱状图嘛,有啥好学的?直到有一次做工业检测项目,产品表面瑕疵死活看不出来,一画直方图,问题立马暴露——嗯,从那以后我再也不敢小看它了。
1.1 直方图的核心概念
什么是直方图?简单说,它统计了图像中每个灰度级(或颜色通道)上出现了多少个像素。横轴是灰度值(0~255),纵轴是像素个数或频率。
直方图的本质:一张图像的概率密度估计。它不关心像素「在哪」,只关心「有多少」。
举个例子。一张 256×256 的图像,总共 65536 个像素。如果灰度值 128 上有 1024 个像素,那直方图在 128 处的柱高就是 1024。你想想看,这能告诉我们什么?
- 图像整体亮度——柱子集中在左边,图偏暗;集中在右边,图偏亮。
- 对比度高低——柱子分布窄,对比度低;分布宽,对比度高。
- 是否有过曝/欠曝——柱子顶到 0 或 255 边界,说明有信息丢失。
我的经验:做图像预处理时,我习惯先看一眼直方图。如果直方图两端「撞墙」,说明有像素被截断了,这时候做增强效果会很差。先做裁剪或归一化,再动手。
1.2 灰度直方图
灰度直方图是最基础的形式。它只处理单通道灰度图像,横轴 0~255,纵轴像素计数。
在 MATLAB 里,画灰度直方图就一行代码:
% 读取灰度图像
img = imread('cameraman.tif');
% 显示直方图
imhist(img);
% 或者获取数据
[counts, binLocations] = imhist(img);
这里 counts 是每个灰度级的像素个数,binLocations 是对应的灰度值。我个人习惯用 imhist 快速预览,用 histogram 做更精细的控制。
| 直方图形态 | 图像特征 | 常见场景 |
|---|---|---|
| 窄峰居中 | 低对比度,灰度集中 | 雾天、水下图像 |
| 双峰分布 | 前景与背景分离明显 | 文档扫描、细胞图像 |
| 单峰偏左 | 整体偏暗 | 夜景、低光照 |
| 单峰偏右 | 整体偏亮 | 过曝、雪景 |
| 均匀分布 | 高对比度,细节丰富 | 理想增强目标 |
注意:我曾经犯过一个错——直接用 imhist 看彩色图像。结果 MATLAB 报错,因为彩色图是三维的。必须先转成灰度,或者分别看每个通道。
1.3 彩色直方图
彩色图像有 R、G、B 三个通道。彩色直方图就是分别统计每个通道的像素分布。你可以把三个通道的直方图叠在一起看,也可以分开看。
MATLAB 实现:
% 读取彩色图像
img = imread('peppers.png');
% 分别提取通道
R = img(:,:,1);
G = img(:,:,2);
B = img(:,:,3);
% 画三个通道的直方图
subplot(1,3,1); imhist(R); title('Red Channel');
subplot(1,3,2); imhist(G); title('Green Channel');
subplot(1,3,3); imhist(B); title('Blue Channel');
这里有个坑——RGB 三个通道的直方图形态差异很大,说明图像颜色偏某个色调。比如红色通道直方图整体偏右,那图像就偏红。
避坑指南:我曾经做过一个肤色检测项目,直接用 RGB 直方图做阈值分割,效果一塌糊涂。后来换成 HSV 色相直方图,问题迎刃而解。记住:RGB 直方图对光照变化很敏感,做颜色分析时优先考虑 HSV 或 Lab 空间。
1.4 直方图的重要性质
直方图有几个性质,搞懂了它们,你才能用好直方图。我列了四个最关键的:
- 位置无关性——直方图不包含像素的空间位置信息。你把图像像素随机打乱,直方图完全不变。这意味着什么?直方图只能告诉你「有什么」,不能告诉你「在哪」。
- 可叠加性——两张图像的直方图可以直接相加(像素数对应相加)。这个性质在做图像拼接、区域统计时很有用。
- 归一化不变性——直方图除以总像素数,得到概率密度函数。归一化后,不同尺寸图像的直方图可以互相比较。
- 单峰/多峰特性——峰的数量和位置,直接反映了图像中主要灰度区域的分布。双峰图像通常适合做阈值分割。
核心理解:直方图是图像的「全局统计特征」,不是「局部结构特征」。它和傅里叶变换一样,都是换一个角度看图像。你失去空间信息,但获得了灰度分布的全局视图。
1.5 知识体系总览
下面这张图,是我梳理的本章知识结构。你可以把它当作学习地图:
这张图把本章的三个核心模块串起来了。灰度直方图和彩色直方图是「工具」,直方图性质是「原理」。先理解性质,再掌握工具,后面做直方图均衡化、规定化时才能得心应手。
我的建议:学完这一章,打开 MATLAB,随便找几张图,用 imhist 和 histogram 反复看。看多了,你一眼就能从直方图猜出图像长什么样。这个「直觉」比背公式重要得多。