第二章 图像基础与色彩空间:RGB、HSV、LAB色彩空间原理
各位同学,今天我们来聊聊色彩空间。说实话,我刚入行那会儿,觉得色彩空间就是个数学概念,RGB转来转去有啥意思?直到我第一次做美颜算法,发现皮肤颜色怎么调都不对劲——嗯,那时候我才意识到,选错色彩空间,你连皮肤都找不准。
2.1 为什么需要不同的色彩空间?
你想想看,人眼看颜色和摄像头拍颜色,根本是两码事。RGB是给机器看的,HSV是给人调的,LAB是给颜色测量用的。我个人的习惯是:做美颜时,先想清楚你要操作什么属性。
- RGB:红绿蓝三通道,直接对应屏幕显示。但三个通道高度相关,调一个颜色,其他颜色也跟着变。
- HSV:色调(H)、饱和度(S)、明度(V)。把颜色和亮度分开了,调肤色时特别方便。
- LAB:亮度(L)和两个颜色通道(a和b)。更接近人眼感知,适合做颜色校正。
核心观点:美颜算法的第一步,就是选对色彩空间。选错了,后面全是白费功夫。
2.2 RGB色彩空间——最基础,也最坑
RGB是加色模型,三个通道叠加出白色。每个通道0-255,一共1677万种颜色。听起来很多对吧?但我在项目中遇到过一个问题:在RGB空间里做肤色检测,光照一变,检测结果就崩了。
为什么会这样?因为RGB三个通道都包含了亮度信息。你想想看,同一个肤色,在强光下R、G、B值都变大了,在暗光下都变小了。用RGB做阈值分割,根本分不清是肤色变了还是光照变了。
避坑指南:我曾经在RGB空间里直接做皮肤美白,结果把白色衣服也美白了一遍。后来才明白,RGB空间里亮度和颜色是绑定的,你动亮度,颜色也跟着变。
2.3 HSV色彩空间——美颜的利器
HSV把颜色拆成三个独立维度:
- H(色调):0-360度,红色0度,绿色120度,蓝色240度
- S(饱和度):0-1,颜色纯度
- V(明度):0-1,亮度
说白了,HSV就是把人眼感知的颜色拆开了。调H只改颜色,调S只改鲜艳度,调V只改亮度。做美颜时,我一般这样用:
// 肤色检测:在HSV空间里找皮肤区域
// H范围:0-50(红黄区间)
// S范围:0.2-0.6(不要太鲜艳也不要太灰)
// V范围:0.3-0.9(不要太暗也不要过曝)
if (h >= 0 && h <= 50 &&
s >= 0.2 && s <= 0.6 &&
v >= 0.3 && v <= 0.9) {
// 这是皮肤区域
}
个人经验:我习惯把H范围设得宽一点,因为不同人种的肤色色调差异很大。但S和V范围要收紧,否则容易把背景也当成皮肤。
2.4 LAB色彩空间——颜色校正的王者
LAB空间是CIE组织搞的,目的是模拟人眼对颜色的感知。L是亮度,a是红绿轴,b是黄蓝轴。这个空间有个特点:两个颜色之间的欧氏距离,和人眼感知的差异基本一致。
我记得有一次做肤色均匀化,在RGB空间里怎么调都调不好。后来换成LAB空间,只动a和b通道,保持L不变——效果立竿见影。
| 色彩空间 | 优点 | 缺点 | 美颜应用 |
|---|---|---|---|
| RGB | 直接显示,计算快 | 颜色和亮度耦合 | 基础显示、简单滤镜 |
| HSV | 颜色独立,直观 | H值不连续(0和360是同一个颜色) | 肤色检测、美白、磨皮 |
| LAB | 感知均匀,颜色独立 | 计算复杂,有边界值问题 | 颜色校正、肤色均匀化 |
2.5 色彩空间转换在美颜中的应用
做美颜算法,说白了就是一套流程:
- RGB转HSV:检测皮肤区域
- 在HSV里操作:调饱和度、提亮肤色
- 转回RGB:显示结果
但这里有个坑——转换不是无损的。RGB转HSV再转回来,会有精度损失。我建议用浮点数计算,最后再转回整数。
// RGB转HSV(浮点版本,精度更高)
void rgb2hsv(float r, float g, float b,
float &h, float &s, float &v) {
float max = std::max({r, g, b});
float min = std::min({r, g, b});
float delta = max - min;
v = max;
if (delta < 1e-6) {
h = 0;
s = 0;
return;
}
s = delta / max;
if (max == r) {
h = 60 * (g - b) / delta;
} else if (max == g) {
h = 60 * (b - r) / delta + 120;
} else {
h = 60 * (r - g) / delta + 240;
}
if (h < 0) h += 360;
}
注意:HSV的H值范围是0-360,但很多库用0-180或0-255。转换前一定要确认范围,否则颜色全乱套了。我曾经因为这个bug,调试了整整一个下午。
2.6 实战:肤色检测与美白
我给大家一个实际案例。做美白时,我的流程是:
- 把图像从RGB转到HSV
- 用H和S范围检测皮肤区域
- 只对皮肤区域的V通道做提亮
- 把结果转回RGB
这样做的好处是:只提亮皮肤,不影响背景和衣服。而且因为只动了V通道,肤色不会偏色。
关键点:美颜的核心不是调颜色,而是知道调哪里。色彩空间转换给了你「只调皮肤」的能力。
2.7 本章知识体系
下面我用一张图来总结本章的核心逻辑:
这张图把三个色彩空间的关系和应用场景串起来了。你想想看,做美颜时,是不是先想清楚要调什么?调亮度去HSV,调颜色去LAB,最后显示再转回RGB。这个思路,我做了这么多年算法,一直没变过。
最后说一句:色彩空间转换是美颜算法的基本功。别嫌它简单,我见过太多人在这上面翻车了。记住:选对空间,事半功倍;选错空间,事倍功半。