3

我正在使用以下算法来检测肤色,但它在不同的光照条件下效果不佳。任何人都可以提供任何建议如何改进它或提出更好的方法

R > 95 AND G > 40 AND B > 20 AND
max{R, G, B} – min{R, G, B} >15 AND
|R – G| > 15 AND
R > G AND R > B
OR
R > 220 AND G > 210 AND B > 170 AND
|R – G| <= 15 AND
R > B AND G > B

http://softexpert.wordpress.com/2007/10/17/skin-color-detection/

干杯

4

5 回答 5

6

您给定的算法是简单的基于颜色的阈值。这仅适用于一组非常基本的条件。对于一些图片,它可能会给出非常好的结果,但作为一般检测器,它会给出很差的结果。

您的第一道攻击线应该是切换到对照明不变的不同颜色模型。实际上,您提供的链接明确说明了这一点!例如,恒指。就个人而言,我更喜欢用 L*a*b* 做一些事情,但是从 RGB 转换的实现会更加困难。

您应该考虑添加一些额外的先验术语,例如,孤立的像素不能是皮肤。

于 2010-12-18T13:51:07.420 回答
4

肤色建模有很多方法,各有优缺点。

根据您的目的选择一个。看看这些调查:

V. Vezhnevets、V. Sazonov、A. Andreeva。基于像素的肤色检测技术的调查。过程。图形,2003

P. Kakumanu、S. Makrogiannis、N. Bourbakis。肤色建模与检测方法综述。模式识别,2007

于 2010-12-16T08:02:00.567 回答
3

我使用色度组件来快速获取图像的肤色区域。

这并不完美,但如果你想要的只是一种快速而肮脏的方法,那也没关系。

这篇论文被 Douglas Chai 称为“在可视电话应用中使用肤色图进行人脸分割”。这是一种相当古老的方法(1999 年)。不幸的是,论文本身是收费的,但方法相当简单:

  • 使用 Cb 和 Cr 的范围检测具有潜在肤色的区域
  • 清理图像的形态学操作
  • 使用标准偏差,进一步分离背景(低)和前景(高)
  • 一些更多的形态学操作来进一步清理图像
  • 轮廓重建(平滑曲线)以产生结果
于 2010-12-23T09:28:49.353 回答
3

如果您使用 RGB,您将遇到照明(亮度)问题。处理肤色检测的最佳方法是 YCbCr 合成。Y 表示亮度 Cb,Cr 表示色度。每个都表示为 RGB 颜色的加权表达式。但是您只使用 Cb 和 Cr 来识别肤色。Y 被丢弃,因为您不希望分析中的亮度。所以使用 YCbCr 而不是 RGB。希望我有所帮助!

于 2013-03-26T08:14:20.737 回答
2

在此处查看我对鲁棒手部检测的回答,其中我推荐了一种使用颜色直方图的方法,该方法仅使用最初来自 Gary Bradski(OpenCV 的创建者)关于面部跟踪的论文的图像的色调和饱和度通道构建。它包括该方法的概述以及有关如何检测皮肤区域的示例代码的链接。

该方法简单但对噪声和光照变化相当稳健,并且能够检测不同的肤色。不需要机器学习:)。

于 2011-12-22T05:52:18.187 回答