图像基础与色彩空间:RGB、HSV、LAB 与直方图
做图像增强,说白了就是跟像素打交道。但像素本身不会告诉你「这张图偏黄了」或者「暗部细节丢了」。你得先理解色彩空间,才能用算法去操控颜色。
我个人习惯把色彩空间比作「语言的方言」。RGB 是普通话,大家都懂;HSV 更像是一种「描述性语言」——你说「这个红色有点淡」,HSV 里直接对应饱和度。而 LAB 呢?它更像数学家的语言,专门用来算「两种颜色差多少」。
这一章,咱们就把这些基础打牢。嗯,别嫌枯燥,后面所有调优技巧都从这里长出来。
RGB 色彩空间:最直观,也最不直观
RGB 就是红绿蓝三个通道。每个像素存三个值,范围 0-255。显示器、相机、手机屏幕,全是 RGB 的天下。
但 RGB 有个大问题:它跟人眼感知不匹配。你想想看,把 R 从 100 加到 150,人眼感觉到的「亮度变化」和「颜色变化」是混在一起的。你在 RGB 里调色,经常是「调了红色,整张图变亮了」——这在图像增强里很要命。
我在项目中遇到过一件事:用 RGB 直方图做对比度拉伸,结果天空从浅蓝变成了青绿,人脸也偏紫了。为什么?因为三个通道独立拉伸,破坏了原有的色彩比例。后来我改用 LAB 或 HSV 做亮度调整,问题就解决了。
HSV 色彩空间:把颜色「拆开」讲
HSV 把颜色拆成三个维度:
- H(Hue,色调):0°-360°,决定是红、绿还是蓝。
- S(Saturation,饱和度):0-1,颜色浓不浓。
- V(Value,明度):0-1,亮不亮。
你看,这三个东西是解耦的。你想让图片更亮,只动 V 通道就行,H 和 S 不变。你想让颜色更鲜艳,只调 S。这在图像增强里太方便了。
转换公式其实不复杂,但手写容易出错。我建议你直接用 OpenCV 的 cv2.cvtColor,参数选 cv2.COLOR_RGB2HSV。不过要注意:OpenCV 里 H 的范围是 0-179,不是 0-360,因为用 uint8 存不下 360。
import cv2
import numpy as np
# 读取图像(BGR 格式)
img = cv2.imread('photo.jpg')
# 转 HSV
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# 只对 V 通道做直方图均衡化
hsv[:,:,2] = cv2.equalizeHist(hsv[:,:,2])
# 转回 BGR
result = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)
LAB 色彩空间:人眼说了算
LAB 是 CIE 组织根据人眼视觉特性设计的。它有三个通道:
- L(Lightness,亮度):0-100,纯黑到纯白。
- A(绿到红):-128 到 127。
- B(蓝到黄):-128 到 127。
LAB 最大的特点是:欧氏距离 ≈ 人眼感知的颜色差异。你在 LAB 空间里算两个像素的差,基本等于人眼觉得「这两个颜色像不像」。这在图像质量评估、色彩迁移、去雾算法里是标配。
我记得有一次做去雾算法调优,用 RGB 算对比度总是跟主观感受对不上。换成 LAB 的 L 通道算对比度,相关性一下子就上去了。说白了,RGB 是给机器看的,LAB 是给人看的。
| 色彩空间 | 适用场景 | 不适合场景 |
|---|---|---|
| RGB | 显示、存储、CNN 输入 | 感知均匀的调优操作 |
| HSV | 颜色增强、低光照、肤色检测 | 需要精确色差计算的场景 |
| LAB | 去雾、色彩迁移、质量评估 | 实时性要求极高的场景(转换略慢) |
直方图:图像的「体检报告」
直方图就是统计每个像素值出现了多少次。横轴是像素值(0-255),纵轴是频数。一张曝光正常的图,直方图应该中间高、两边低,像一座山。
你想想看,如果直方图左边堆得老高,说明暗部细节挤在一起,图太暗。右边堆得高,图太亮。中间有缺口,说明对比度不够,图像发灰。
直方图在图像增强里有两个核心用途:
- 诊断问题:看一眼直方图,就知道这张图是欠曝、过曝还是低对比度。
- 指导操作:直方图均衡化就是把像素值重新分布,让直方图更「平」,从而提升对比度。
但直方图均衡化有个副作用:它会让噪声更明显。为什么?因为均衡化会拉伸像素值的间距,噪声也被放大了。我建议你在做均衡化之前,先做一次轻度去噪,比如高斯滤波或中值滤波。
# 计算直方图
hist = cv2.calcHist([img], [0], None, [256], [0, 256])
# 直方图均衡化
equalized = cv2.equalizeHist(img)
# 自适应直方图均衡化(CLAHE)—— 推荐
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
clahe_result = clahe.apply(img)
色彩空间与直方图的联动
你可以在不同色彩空间里看直方图,得到的信息完全不同:
- RGB 直方图:三个通道各自分布,能看出偏色(比如蓝色通道整体右移,说明偏蓝)。
- HSV 的 V 通道直方图:只看亮度分布,适合做亮度调整。
- LAB 的 L 通道直方图:更接近人眼感知的亮度分布,适合做感知均匀的对比度调整。
我个人习惯是:先看 RGB 直方图判断偏色,再看 V 通道直方图判断亮度分布,最后用 L 通道做精细调整。三步走,基本不会漏问题。
本章小结
RGB、HSV、LAB 三个色彩空间,各有各的脾气。RGB 是基础,但别用它做感知调优。HSV 把亮度和颜色拆开了,适合做增强。LAB 最接近人眼,适合做精细调整和质量评估。
直方图是图像增强的「仪表盘」。学会看直方图,你就能快速判断一张图的问题出在哪。再结合色彩空间转换,你就能精准地只调整「该调的部分」,不碰「不该动的地方」。