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. 亮度分布:图像是偏亮还是偏暗?对比度高还是低?
  2. 动态范围:像素值覆盖了多大范围?有没有浪费灰度级?
  3. 信息量:直方图越平坦,通常意味着图像包含的信息越丰富。

举个例子。一张曝光正常的照片,直方图应该像一座平缓的山丘,从左到右均匀分布。如果山峰全挤在左边,说明图像偏暗;全挤在右边,说明过曝。中间有缺口?那说明某些亮度级别的像素压根没有,图像层次感就会差。

我的经验: 在工业检测项目中,我经常用直方图来判断光照是否均匀。如果直方图出现多个明显的峰,说明图像中存在多个亮度区域,可能是光照不均或者反光造成的。

1.4 直方图的三种常见形态

我在项目中遇到过三种典型的直方图形态,每种都对应着不同的图像问题:

形态 特征 图像表现 常见场景
窄峰型 像素集中在狭窄范围 对比度低,灰蒙蒙 雾天、逆光、低端摄像头
双峰型 两个明显峰值 前景与背景分离明显 文档扫描、显微图像
偏斜型 峰值偏向一侧 过曝或欠曝 强光环境、暗光拍摄

你想想看,如果一张医学 X 光片的直方图是窄峰型,那医生很可能看不清病灶细节。这就是为什么直方图均衡化在医学影像中应用广泛——它能拉伸对比度,让细节显现出来。

1.5 直方图与图像质量的关系

直方图还能反映图像质量的一些关键指标:

  • 对比度:直方图的宽度决定了对比度。宽度越大,对比度越高。
  • 亮度:直方图的均值位置决定了整体亮度。
  • 信息熵:直方图越均匀,信息熵越大,图像包含的信息越丰富。
避坑指南: 我曾经在一个项目中,直接用直方图均值来判断图像是否过曝。结果发现,一张图像虽然均值正常,但直方图两端都出现了「截断」——亮部和暗部的细节全丢了。所以只看均值是不够的,一定要看直方图的整体形态。

1.6 直方图知识体系

下面这张图总结了本章的核心知识结构,帮你快速建立直方图的整体认知:

直方图知识体系 图像直方图 数学定义 物理意义 应用场景 离散函数 h(r_k)=n_k 归一化概率 p(r_k) 亮度分布 动态范围 信息量/信息熵 图像增强 质量检测 图像分割

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 本章小结

直方图是图像处理中最基础、最强大的工具。它用最简单的统计方式,揭示了图像的亮度分布、对比度和动态范围。掌握了直方图,你就拿到了图像增强的第一把钥匙。