1、图像直方图基础:什么是直方图?直方图的数学定义与物理意义
1.1 从一张照片说起
你有没有遇到过这种情况?拍了一张照片,看起来灰蒙蒙的,像蒙了一层雾。或者反过来,照片里亮的地方太亮,暗的地方太暗,细节全丢了。
我刚开始做图像处理时,第一反应就是调亮度、拉对比度。后来才发现,真正懂行的人,第一件事是看直方图。说白了,直方图就是图像的「体检报告」。它不关心你拍的是什么内容,只关心像素的「亮度分布」。
举个例子。一张正常的风景照,直方图应该像一座平缓的山丘,从左到右均匀分布。如果山峰全挤在左边,说明图像偏暗;全挤在右边,说明过曝。中间有缺口?那说明某些亮度级别的像素压根没有,图像层次感就会差。
1.2 直方图的数学定义
咱们先看数学定义,其实很简单。
对于一张灰度图像,假设像素值范围是 [0, L-1],比如 8 位图像就是 0~255。直方图就是一个离散函数:
h(r_k) = n_k
其中:
- r_k 是第 k 个灰度级(比如 128)
- n_k 是图像中灰度级为 r_k 的像素个数
嗯,这里要注意:直方图不记录像素的位置信息。它只告诉你「有多少像素是这个亮度」,不告诉你「这些像素在图像的哪个位置」。所以两张完全不同的图像,可能拥有完全相同的直方图。
我习惯把直方图归一化,方便不同尺寸的图像做对比:
p(r_k) = n_k / (M × N)
其中 M×N 是图像总像素数。归一化后的 p(r_k) 就是概率密度函数(PDF)的估计值,所有 p(r_k) 之和等于 1。
| 概念 | 符号 | 含义 | 取值范围 |
|---|---|---|---|
| 灰度级 | r_k | 第 k 个亮度值 | 0 ~ L-1 |
| 频数 | n_k | 该灰度级的像素个数 | 0 ~ M×N |
| 概率 | p(r_k) | 该灰度级出现的概率 | 0.0 ~ 1.0 |
1.3 物理意义:直方图到底在说什么?
直方图的物理意义,我总结为三个层次:
- 亮度分布:图像是偏亮还是偏暗?对比度高还是低?
- 动态范围:像素值覆盖了多大范围?有没有浪费灰度级?
- 信息量:直方图越平坦,通常意味着图像包含的信息越丰富。
举个例子。一张曝光正常的照片,直方图应该像一座平缓的山丘,从左到右均匀分布。如果山峰全挤在左边,说明图像偏暗;全挤在右边,说明过曝。中间有缺口?那说明某些亮度级别的像素压根没有,图像层次感就会差。
1.4 直方图的三种常见形态
我在项目中遇到过三种典型的直方图形态,每种都对应着不同的图像问题:
| 形态 | 特征 | 图像表现 | 常见场景 |
|---|---|---|---|
| 窄峰型 | 像素集中在狭窄范围 | 对比度低,灰蒙蒙 | 雾天、逆光、低端摄像头 |
| 双峰型 | 两个明显峰值 | 前景与背景分离明显 | 文档扫描、显微图像 |
| 偏斜型 | 峰值偏向一侧 | 过曝或欠曝 | 强光环境、暗光拍摄 |
你想想看,如果一张医学 X 光片的直方图是窄峰型,那医生很可能看不清病灶细节。这就是为什么直方图均衡化在医学影像中应用广泛——它能拉伸对比度,让细节显现出来。
1.5 直方图与图像质量的关系
直方图还能反映图像质量的一些关键指标:
- 对比度:直方图的宽度决定了对比度。宽度越大,对比度越高。
- 亮度:直方图的均值位置决定了整体亮度。
- 信息熵:直方图越均匀,信息熵越大,图像包含的信息越丰富。
1.6 直方图知识体系
下面这张图总结了本章的核心知识结构,帮你快速建立直方图的整体认知:
1.7 动手算一个直方图
光说不练假把式。咱们拿一个 4×4 的微型图像,手动算一遍直方图。
假设图像像素值如下:
[[ 50, 50, 100, 100],
[ 50, 100, 150, 150],
[100, 150, 200, 200],
[100, 150, 200, 255]]
统计每个灰度级的像素个数:
| 灰度级 | 50 | 100 | 150 | 200 | 255 |
|---|---|---|---|---|---|
| 频数 n_k | 3 | 5 | 3 | 4 | 1 |
| 概率 p(r_k) | 0.1875 | 0.3125 | 0.1875 | 0.25 | 0.0625 |
你看,直方图就是这么简单。但就是这简单的统计,能告诉我们很多信息。比如这张图,像素集中在 100 和 200 附近,中间 150 反而少——说明图像可能缺乏平滑过渡,看起来会有点「硬」。
np.histogram() 快速看一眼直方图,再决定要不要做均衡化。很多时候,看一眼直方图就能判断图像是否需要处理,省得盲目调参。
1.8 本章小结
直方图是图像处理中最基础、最强大的工具。它用最简单的统计方式,揭示了图像的亮度分布、对比度和动态范围。掌握了直方图,你就拿到了图像增强的第一把钥匙。