本节摘要:SOURCE 3.1:直方图均衡化拉平 CDF 增对比;伽马 O=I^{\gamma} 调节明暗。本节动手
equalizeHist与 LUT 实现 γ 变换,对比过曝/欠曝修复。
import cv2, matplotlib.pyplot as plt img = cv2.imread('dark.jpg', 0) hist = cv2.calcHist([img], [0], None, [256], [0,256]) eq = cv2.equalizeHist(img) cv2.imwrite('eq.jpg', eq)
均衡化:s = T(r) 使输出近似均匀 — 整图对比度提升,但可能过度增强噪声。
SOURCE:O = I^{\gamma},I 归一化到 [0,1]。
def gamma_correct(img, gamma=1.0): inv = 1.0 / gamma table = np.array([((i/255.0)**inv)*255 for i in range(256)]).astype('uint8') return cv2.LUT(img, table) bright = gamma_correct(img, 0.5) # γ<1 提亮 dark = gamma_correct(img, 2.0)
| 方法 | 适用 | 副作用 |
|---|---|---|
| 均衡 | 整体偏暗/亮 | 噪声放大 |
| γ 校正 | 显示器/非线性 | 需调 γ |
| CLAHE | 局部对比 | 参数 blockSize |

clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8)) cl = clahe.apply(img)
医学 X 光常用 CLAHE 避免全局均衡过曝。
clipLimit 从 1→4 的变化⚠️ 常见坑:对彩色图直接 equalize 各通道 — 色偏;应转 YUV 对 Y 通道做。
💡 关键直觉:直方图是诊断工具 — 先看分布再选变换。
equalizeHist 全局对比度下一节几何变换。
直方图统计每个灰度级出现的像素个数,归一化后就是灰度的概率分布。看直方图能直接诊断图像问题:整体偏暗的图直方图集中在左侧低灰度区;偏亮集中在右侧;对比度低的图直方图瘦长集中在中间;双峰直方图往往意味着前景背景灰度分离明显(这是 Otsu 分割的前提)。因此直方图不是要"背的结论",而是要"用的工具"——拿到任何一张图像,先画直方图判断状态,再决定增强手段,这是专业与业余的分水岭。
import cv2, numpy as np def draw_hist(img, name): hist = cv2.calcHist([img], [0], None, [256], [0,256]) norm = hist / hist.sum() # 归一化为概率分布 # 记录灰度均值与标准差,量化"整体明暗"与"对比度" print(name, 'mean=', img.mean(), 'std=', img.std())
均衡化把灰度直方图往"均匀分布"方向拉伸:对暗区占多的图,把低灰度区间拉开、让暗部的层次更分明。本质是对灰度做非线性映射 s = T(r),T 由累积分布函数(CDF)导出——灰度级出现得越多,映射后被拉开得越宽。它的副作用是:原本已经接近均匀的直方图会被过度拉伸,平坦区域(如天空、白墙)的微小噪声被放大成可见的块状纹理。所以均衡化适合"整体偏暗或偏亮"的图像,不适合本身对比度良好的图像。
伽马校正用 O = I^gamma 控制明暗曲线:gamma 小于 1 提亮暗部(显示器对暗部的感知非线性,常见 gamma 2.2 的显示校正),大于 1 压暗亮部。它是一张查找表(LUT),对每个灰度级预先算好映射,逐像素查表即可,速度极快。CLAHE 是均衡化的局部版:把图像分块,每块各自做均衡,并限制对比度增强幅度(clipLimit),避免大块平坦区域被过度增强。三者的选择:全局偏暗用均衡化,显示器非线性或调节明暗用伽马,局部光照不均(如 X 光、文字扫描)用 CLAHE。彩色图像增强时,转 YUV 只对亮度 Y 做,避免色偏,这是必须养成的习惯。
实验设计上,建议用同一张欠曝照片依次跑均衡化、伽马 0.6、CLAHE 三套方案,并排对比直方图和目视效果,重点观察各自的副作用:均衡化是否出现噪块,伽马是否让高光过曝,CLAHE 是否出现块状边界。理解"每种增强手段都带副作用",是选择增强策略的核心能力。
另外,增强操作在深度学习预处理里也大量出现:训练时对图像做随机亮度、对比度扰动(本质就是伽马和均衡化的随机版),是提升模型光照鲁棒性的标准数据增强手段。学好本节的变换思想,理解那些"增强参数"到底改变了图像的什么,对训练调参也有直接帮助。最后,直方图还有一个隐蔽用途:图像质量检测。工业视觉里可以用直方图分布判断曝光是否合格、是否有条纹伪影、内容是否与预期类别匹配,是自动化产线常见的首道质检手段。
补一个直方图的高级用法:直方图可以当作"图像的指纹"用于匹配与检索——把每张图的灰度直方图归一化成一个向量,两张图的相似度就可以用直方图距离(如相关系数、卡方距离)来度量。工业上常用它做产品质量分拣(颜色分布是否符合标准)、镜头切换检测、以及图片重复检测。此外,直方图匹配(把一张图的直方图形状映射到目标分布)可以统一不同设备拍摄图像的色调,是多相机系统里做色彩一致性校正的基础手段。理解"直方图既是诊断工具也是特征向量",直方图的用途就完全打开了。