1. 什么是颜色空间

同一个颜色,可以用不同方式表示。 平时熟悉的是RGB

  • R=红色强度
  • G=绿色强度
  • B=蓝色强度

一个像素可能是:

  • R=220
  • G=170
  • B=140

这看起来像偏浅的肤色。 但RGB本身有个问题,它把“颜色本身”和“亮不亮”混在一起了。 同一块皮肤,在暗光下RGB会整体变小;在强光下RGB会整体变大。直接用RGB判断肤色不稳定。

2. HSV是什么

HSV把颜色拆成:

  • H=Hue,色相,是什么颜色
  • S=Saturation,饱和度,颜色浓不浓
  • V=Value,亮度,亮不亮

举例:

  • 红色、黄色、蓝色 主要体现在H不同
  • 灰色、白色 S很低
  • 亮红、暗红 V不同 肤色通常在HSV里会落在一个大范围内。

3. YCrCb是什么

YCrCb把颜色拆成:

  • Y = 亮度
  • Cr = 红色色度分量
  • Cb = 蓝色色度分量

可以粗略理解为:

  • Y:这个像素有多亮
  • Cr/Cb:这个像素的颜色偏向 肤色在Cr和Cb上通常会落在一个经验范围内

4. 什么叫颜色空间阈值

“阈值”就是范围。 所以颜色空间阈值判断,本质就是:

  • 把图片每个像素转换成HSV/YCrCb
  • 检查它是否落在肤色经验范围内
  • 落在范围内 记为肤色像素
  • 否则 非肤色像素

5. 为什么同时用HSV和YCrCb

只用一种颜色空间容易误判。 比如:

  • 浅色衣服可能在HSV里像肤色
  • 暖色背景可能在YCrCb里像肤色
  • 过曝区域可能接近皮肤但其实不是皮肤

必须两个都满足没才算肤色。这里更保守。

6. 在我们方案中裸露判断里怎么用

  1. YOLO找到人体框 person box
  2. SCRFD找到人脸框 face box
  3. 从 person box里扣掉 face box
  4. 对剩下区域逐像素判断是否为肤色
  5. 统计肤色像素面积

7. 优缺点

优点:

  • 不需要是训练新模型
  • 结果可以解释
  • 阈值可以调

缺点:

  • 不是语义理解,只是颜色规则
  • 肉色衣服可能误判
  • 滤镜、暖光、过曝会影响
  • 深色肤色、强阴影可能误判
  • 手、脖子、腿都会算作肤色,但它不知道这些部位是否违规