图像基础与色彩空间:RGB、HSV、LAB 与直方图

做图像增强,说白了就是跟像素打交道。但像素本身不会告诉你「这张图偏黄了」或者「暗部细节丢了」。你得先理解色彩空间,才能用算法去操控颜色。

我个人习惯把色彩空间比作「语言的方言」。RGB 是普通话,大家都懂;HSV 更像是一种「描述性语言」——你说「这个红色有点淡」,HSV 里直接对应饱和度。而 LAB 呢?它更像数学家的语言,专门用来算「两种颜色差多少」。

这一章,咱们就把这些基础打牢。嗯,别嫌枯燥,后面所有调优技巧都从这里长出来。

RGB 色彩空间:最直观,也最不直观

RGB 就是红绿蓝三个通道。每个像素存三个值,范围 0-255。显示器、相机、手机屏幕,全是 RGB 的天下。

但 RGB 有个大问题:它跟人眼感知不匹配。你想想看,把 R 从 100 加到 150,人眼感觉到的「亮度变化」和「颜色变化」是混在一起的。你在 RGB 里调色,经常是「调了红色,整张图变亮了」——这在图像增强里很要命。

核心认知: RGB 适合存储和显示,不适合做「感知均匀」的调优操作。

我在项目中遇到过一件事:用 RGB 直方图做对比度拉伸,结果天空从浅蓝变成了青绿,人脸也偏紫了。为什么?因为三个通道独立拉伸,破坏了原有的色彩比例。后来我改用 LAB 或 HSV 做亮度调整,问题就解决了。

HSV 色彩空间:把颜色「拆开」讲

HSV 把颜色拆成三个维度:

  • H(Hue,色调):0°-360°,决定是红、绿还是蓝。
  • S(Saturation,饱和度):0-1,颜色浓不浓。
  • V(Value,明度):0-1,亮不亮。

你看,这三个东西是解耦的。你想让图片更亮,只动 V 通道就行,H 和 S 不变。你想让颜色更鲜艳,只调 S。这在图像增强里太方便了。

我的习惯: 做低光照增强时,我通常先转 HSV,只对 V 通道做直方图均衡化或伽马校正,然后转回 RGB。这样能避免颜色漂移。

转换公式其实不复杂,但手写容易出错。我建议你直接用 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)
注意: 不要对 H 通道做平滑或均衡化!H 是环形数据(0°和 360°是同一个颜色),直接做均值滤波会产生伪影。我曾经踩过这个坑,结果图像里出现了诡异的彩色条纹。

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),纵轴是频数。一张曝光正常的图,直方图应该中间高、两边低,像一座山。

你想想看,如果直方图左边堆得老高,说明暗部细节挤在一起,图太暗。右边堆得高,图太亮。中间有缺口,说明对比度不够,图像发灰。

直方图在图像增强里有两个核心用途:

  1. 诊断问题:看一眼直方图,就知道这张图是欠曝、过曝还是低对比度。
  2. 指导操作:直方图均衡化就是把像素值重新分布,让直方图更「平」,从而提升对比度。
一句话总结: 直方图是图像增强的「听诊器」。不看直方图就调参数,等于闭着眼睛修图。

但直方图均衡化有个副作用:它会让噪声更明显。为什么?因为均衡化会拉伸像素值的间距,噪声也被放大了。我建议你在做均衡化之前,先做一次轻度去噪,比如高斯滤波或中值滤波。

# 计算直方图
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)
避坑指南: 我曾经在医疗影像项目里直接用全局直方图均衡化,结果把背景噪声放大成了「伪病灶」。后来换成 CLAHE(对比度受限自适应直方图均衡化),限制每个局部区域的对比度拉伸幅度,效果就好多了。clipLimit 参数我一般从 2.0 开始调,太大容易过增强。

色彩空间与直方图的联动

你可以在不同色彩空间里看直方图,得到的信息完全不同:

  • RGB 直方图:三个通道各自分布,能看出偏色(比如蓝色通道整体右移,说明偏蓝)。
  • HSV 的 V 通道直方图:只看亮度分布,适合做亮度调整。
  • LAB 的 L 通道直方图:更接近人眼感知的亮度分布,适合做感知均匀的对比度调整。

我个人习惯是:先看 RGB 直方图判断偏色,再看 V 通道直方图判断亮度分布,最后用 L 通道做精细调整。三步走,基本不会漏问题。

图像增强色彩空间选择流程 输入图像(RGB) 诊断:看 RGB 直方图判断偏色 转 HSV,调 V 通道 转 LAB,调 L 通道 CLAHE / 伽马校正 去雾 / 色彩迁移 输出增强图像 💡 核心原则 先诊断,再选空间,最后调参数

本章小结

RGB、HSV、LAB 三个色彩空间,各有各的脾气。RGB 是基础,但别用它做感知调优。HSV 把亮度和颜色拆开了,适合做增强。LAB 最接近人眼,适合做精细调整和质量评估。

直方图是图像增强的「仪表盘」。学会看直方图,你就能快速判断一张图的问题出在哪。再结合色彩空间转换,你就能精准地只调整「该调的部分」,不碰「不该动的地方」。